Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Необычное использованиеa функций

2.3K
07 октября 2002 года
Inferno
1 / / 07.10.2002
Добрый день !

Как мне можно решить следующую задачу.

Упрощенно все это выглядит так.

Есть ряд описанных функций. Есть файл, в
котором функции привязаны к неким командам.
Что-то типа такого (формат файла):

.
.
.
#COMMAND
1 // Номер
scan // Имя команды
&do_scan // Имя процедуры
#END
.
.
.

Есть процедура

void do_scan()
{
//Чего-то делает
};

Могу ли я каким-нибудь образом вызвать именно ту
процедуру, которая описана в файле.

Может написал непонятно. Тогда так: нужно перевести имя функции, хранящейся в строке в адрес, по которому функция лежит и вызвать ее. Желательно не использовать предопределенных массивов с сопоставлениями.
317
07 октября 2002 года
Relax
573 / / 20.09.2000
то о чем ты говоришь - типичный пример работы с DLL, когда функции подгружаются динамически. Тебе поможет функция GetProcAddress...
250
08 октября 2002 года
Joker
1.4K / / 20.02.2000
Цитата:
Originally posted by Inferno
Добрый день !

Как мне можно решить следующую задачу.

Упрощенно все это выглядит так.

Есть ряд описанных функций. Есть файл, в
котором функции привязаны к неким командам.
Что-то типа такого (формат файла):

.
.
.
#COMMAND
1 // Номер
scan // Имя команды
&do_scan // Имя процедуры
#END
.
.
.

Есть процедура

void do_scan()
{
//Чего-то делает
};

Могу ли я каким-нибудь образом вызвать именно ту
процедуру, которая описана в файле.

Может написал непонятно. Тогда так: нужно перевести имя функции, хранящейся в строке в адрес, по которому функция лежит и вызвать ее. Желательно не использовать предопределенных массивов с сопоставлениями.



Если я правильно понял такое сделать, нельзя(т.е стандартными возможносстями апи), возможно забурить большой список свич но не более...

442
09 октября 2002 года
HexoGenus
121 / / 20.03.2000
Желательно не использовать предопределенных массивов с сопоставлениями.

Как вариант:
Так как параметры если я правильно понял либо вообще не передаются, либо передаются в виде текстовой строки, то если не хочется воротить большой свитч то можно сделать его аналог:

Набор функций каждая из которых получает два текстовых параметра:
1. Имя функции которая должна выполнится
2. Параметры для функции в виде текста
Когда требуется выполнить функцию, запускается первая из цепочки и если видит что передаваемый параметр не ее имя то она передает управление следующей функции в цепочке...

Есть ли у этого способа преимущества перед большим свитчем ???
Черт его знает может и можно найти :-)))))

Но если имя функции зарание либо в ней либо в каком-то адресе не прописать то ее вызвать будет невозможно так как в ходе компиляции программы все имена заменяются на адреса в памяти, или на относительные смещения относительно текущей точки... и найти функцию по ее имени будет невозможно... Но можно же каждую функцию научить откликаться на свое имя, типа: Тузик!!! Голос!!!!
:D
442
09 октября 2002 года
HexoGenus
121 / / 20.03.2000
Желательно не использовать предопределенных массивов с сопоставлениями.

Как вариант:
Так как параметры если я правильно понял либо вообще не передаются, либо передаются в виде текстовой строки, то если не хочется воротить большой свитч то можно сделать его аналог:

Набор функций каждая из которых получает два текстовых параметра:
1. Имя функции которая должна выполнится
2. Параметры для функции в виде текста
Когда требуется выполнить функцию, запускается первая из цепочки и если видит что передаваемый параметр не ее имя то она передает управление следующей функции в цепочке...

Есть ли у этого способа преимущества перед большим свитчем ???
Черт его знает может и можно найти :-)))))

Но если имя функции зарание либо в ней либо в каком-то адресе не прописать то ее вызвать будет невозможно так как в ходе компиляции программы все имена заменяются на адреса в памяти, или на относительные смещения относительно текущей точки... и найти функцию по ее имени будет невозможно... Но можно же каждую функцию научить откликаться на свое имя, типа: Тузик!!! Голос!!!!
:D
317
10 октября 2002 года
Relax
573 / / 20.09.2000
то есть вы думаете с GetProcAddress - ом не получится? Может и так - сам не пробовал - это просто теоретическое предпопложение, но в ближайшее время попробую экзампл сотворить - если получится - выложу ;)
442
10 октября 2002 года
HexoGenus
121 / / 20.03.2000
Цитата:
Originally posted by Relax
то есть вы думаете с GetProcAddress - ом не получится? Может и так - сам не пробовал - это просто теоретическое предпопложение, но в ближайшее время попробую экзампл сотворить - если получится - выложу ;)



Почему не получится с DLL....
Я такого не говорил :-)
Я говорил про исполнимый файл...
DLL это не совсем обычный программный код... и компилится он как раз для динамического вызова функций и имена у них при компиляции сохраняются... да еще как сохраняются....

А я просто еще один вариант предложил ...
А насчет варианта с DLL - нормальный ход, но я как то пробовал писать DLL мне не понравилось :-( уж больно много вручную каждый раз писать приходится... не то что бы мы такие ленивые но...
:D

2.1K
10 октября 2002 года
kmn
29 / / 09.10.2002
Цитата:
Originally posted by HexoGenus


Почему не получится с DLL....
Я такого не говорил :-)
Я говорил про исполнимый файл...
DLL это не совсем обычный программный код... и компилится он как раз для динамического вызова функций и имена у них при компиляции сохраняются... да еще как сохраняются....

А я просто еще один вариант предложил ...
А насчет варианта с DLL - нормальный ход, но я как то пробовал писать DLL мне не понравилось :-( уж больно много вручную каждый раз писать приходится... не то что бы мы такие ленивые но...
:D



Создавать DLL не обезательно. Експортировать функцию можно и из Exe-шника.

Рабочий пример:


//// Cpp file

#include "stdafx.h"
#include <windows.h>

typedef void (*MYPROC)();

EXTERN_C void Export_Func()
{
MessageBox(NULL, _T("hsgshsdhsgd"), _T("hsdgshdg"), MB_OK);
}

int _tmain(int argc, _TCHAR* argv[])
{

MYPROC lpProc = (MYPROC)GetProcAddress(NULL, _T("Export_Func"));
if (lpProc)
lpProc();

return 0;
}

//// def file

EXPORTS
Export_Func

/// P.S. Def файл желателно использовать что бы не было проблем с именами.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог