Необычное использованиеa функций
Как мне можно решить следующую задачу.
Упрощенно все это выглядит так.
Есть ряд описанных функций. Есть файл, в
котором функции привязаны к неким командам.
Что-то типа такого (формат файла):
.
.
.
#COMMAND
1 // Номер
scan // Имя команды
&do_scan // Имя процедуры
#END
.
.
.
Есть процедура
void do_scan()
{
//Чего-то делает
};
Могу ли я каким-нибудь образом вызвать именно ту
процедуру, которая описана в файле.
Может написал непонятно. Тогда так: нужно перевести имя функции, хранящейся в строке в адрес, по которому функция лежит и вызвать ее. Желательно не использовать предопределенных массивов с сопоставлениями.
Добрый день !
Как мне можно решить следующую задачу.
Упрощенно все это выглядит так.
Есть ряд описанных функций. Есть файл, в
котором функции привязаны к неким командам.
Что-то типа такого (формат файла):
.
.
.
#COMMAND
1 // Номер
scan // Имя команды
&do_scan // Имя процедуры
#END
.
.
.
Есть процедура
void do_scan()
{
//Чего-то делает
};
Могу ли я каким-нибудь образом вызвать именно ту
процедуру, которая описана в файле.
Может написал непонятно. Тогда так: нужно перевести имя функции, хранящейся в строке в адрес, по которому функция лежит и вызвать ее. Желательно не использовать предопределенных массивов с сопоставлениями.
Если я правильно понял такое сделать, нельзя(т.е стандартными возможносстями апи), возможно забурить большой список свич но не более...
Как вариант:
Так как параметры если я правильно понял либо вообще не передаются, либо передаются в виде текстовой строки, то если не хочется воротить большой свитч то можно сделать его аналог:
Набор функций каждая из которых получает два текстовых параметра:
1. Имя функции которая должна выполнится
2. Параметры для функции в виде текста
Когда требуется выполнить функцию, запускается первая из цепочки и если видит что передаваемый параметр не ее имя то она передает управление следующей функции в цепочке...
Есть ли у этого способа преимущества перед большим свитчем ???
Черт его знает может и можно найти :-)))))
Но если имя функции зарание либо в ней либо в каком-то адресе не прописать то ее вызвать будет невозможно так как в ходе компиляции программы все имена заменяются на адреса в памяти, или на относительные смещения относительно текущей точки... и найти функцию по ее имени будет невозможно... Но можно же каждую функцию научить откликаться на свое имя, типа: Тузик!!! Голос!!!!
:D
Как вариант:
Так как параметры если я правильно понял либо вообще не передаются, либо передаются в виде текстовой строки, то если не хочется воротить большой свитч то можно сделать его аналог:
Набор функций каждая из которых получает два текстовых параметра:
1. Имя функции которая должна выполнится
2. Параметры для функции в виде текста
Когда требуется выполнить функцию, запускается первая из цепочки и если видит что передаваемый параметр не ее имя то она передает управление следующей функции в цепочке...
Есть ли у этого способа преимущества перед большим свитчем ???
Черт его знает может и можно найти :-)))))
Но если имя функции зарание либо в ней либо в каком-то адресе не прописать то ее вызвать будет невозможно так как в ходе компиляции программы все имена заменяются на адреса в памяти, или на относительные смещения относительно текущей точки... и найти функцию по ее имени будет невозможно... Но можно же каждую функцию научить откликаться на свое имя, типа: Тузик!!! Голос!!!!
:D
то есть вы думаете с GetProcAddress - ом не получится? Может и так - сам не пробовал - это просто теоретическое предпопложение, но в ближайшее время попробую экзампл сотворить - если получится - выложу ;)
Почему не получится с DLL....
Я такого не говорил :-)
Я говорил про исполнимый файл...
DLL это не совсем обычный программный код... и компилится он как раз для динамического вызова функций и имена у них при компиляции сохраняются... да еще как сохраняются....
А я просто еще один вариант предложил ...
А насчет варианта с DLL - нормальный ход, но я как то пробовал писать DLL мне не понравилось :-( уж больно много вручную каждый раз писать приходится... не то что бы мы такие ленивые но...
:D
Почему не получится с 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 файл желателно использовать что бы не было проблем с именами.