Люди, как можно экспортировать callback-функцию из dll. Нужен живой, работающий пример (желательно и как это писать в длл и как писать сторону клиента).
Вот что пишу я:
dll:
extern "C" __declspec(dllexport) BOOL CALLBACK StateOfPC(LPSTR psMessage)
{.............}
OR
typedef BOOL (WINAPI CALLBACK *cfunc___)(LPSTR);
И чего тольок не вписываю: и typedef BOOL (CALLBACK *cfunc___)(LPSTR);
и typedef BOOL (__cdecl *cfunc___)(LPSTR);
и typedef BOOL (__stdcall *cfunc___)(LPSTR);
Пока ничего не помогло. Что дальше?
Сенкс.
05.02.03 18:05: Перенесено модератором из 'C/C++' — ПК
Здравствуйте, culver, Вы писали:
C>Люди, как можно экспортировать callback-функцию из dll. Нужен живой, работающий пример (желательно и как это писать в длл и как писать сторону клиента).
C>Вот что пишу я: C>dll: C>extern "C" __declspec(dllexport) BOOL CALLBACK StateOfPC(LPSTR psMessage) C>{.............} C> C>exe: C>BOOL ( CALLBACK *state)(LPSTR st1); C>state=(BOOL (CALLBACK *)(LPSTR))GetProcAddress(hInst,"StateOfPC"); C> C>OR C>typedef BOOL (WINAPI CALLBACK *cfunc___)(LPSTR); C>И чего тольок не вписываю: и typedef BOOL (CALLBACK *cfunc___)(LPSTR); C>и typedef BOOL (__cdecl *cfunc___)(LPSTR); C>и typedef BOOL (__stdcall *cfunc___)(LPSTR); C> C>Пока ничего не помогло. Что дальше?
Может надо писать:
GetProcAddress(hInst,"_StateOfPC@4");
Актуально, если компилятор MSVC и нет def-файла, для компиляторов от Borland не актуально.
Или может написать:
*(LPVOID*)&state = GetProcAddress
Здравствуйте, Roman_M, Вы писали:
RM>Может надо писать: RM>GetProcAddress(hInst,"_StateOfPC@4");
все равно не помагает RM>Актуально, если компилятор MSVC и нет def-файла
и это тоже не помагает RM>Или может написать: RM>*(LPVOID*)&state = GetProcAddress
вроде как что-то дает, уже ближе к жизни. А можно объяснить почему так пишется?
Здравствуйте, culver, Вы писали:
C>Если ВНИМАТЕЛЬНО прочитать мой пост, то там есть: C>"И чего тольок не вписываю:... и typedef BOOL (__stdcall *cfunc___)(LPSTR);
Здравствуйте, Roman_M, Вы писали:
RM>Или может написать: RM>*(LPVOID*)&state = GetProcAddress
Это тоже чаво-то не того, так вроде как работает, но дает какую-то глупую ошибку 183:Cannot create a file when that file already exists. Причем тут это, файлов я не создаю.
Что ж это могет быть?
Здравствуйте, culver, Вы писали:
C>Здравствуйте, Roman_M, Вы писали:
RM>>Или может написать: RM>>*(LPVOID*)&state = GetProcAddress C>Это тоже чаво-то не того, так вроде как работает, но дает какую-то глупую ошибку 183:Cannot create a file when that file already exists. Причем тут это, файлов я не создаю. C> C>Что ж это могет быть?
От синтаксиса эта ошибка наверняка не зависит. Написание в стиле *(LPVOID*)&state = GetProcAddress — извращенное приведение типов, правильность применения которого спорна, правильно, конечно же, писать типа state = (BOOL (CALLBACK *)(LPSTR))GetProcAddress или использовать typedef, но часто быстрее написать вот это "*(LPVOID*)&", чем писать правильную конструкцию. Суть конструкции сводится к тому, что получается "void **state", а потом пишется "*state = ...", а указателю void * без проблем присваиваются другие типы указателей.