callback&dll
От: culver Украина  
Дата: 05.02.03 13:01
Оценка:
Люди, как можно экспортировать callback-функцию из dll. Нужен живой, работающий пример (желательно и как это писать в длл и как писать сторону клиента).

Вот что пишу я:
dll:
extern "C" __declspec(dllexport) BOOL CALLBACK StateOfPC(LPSTR psMessage)
{.............}

exe:
BOOL ( CALLBACK *state)(LPSTR st1);
state=(BOOL (CALLBACK *)(LPSTR))GetProcAddress(hInst,"StateOfPC");

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++' — ПК
Re: callback&dll
От: Максим Алексейкин Россия  
Дата: 05.02.03 14:33
Оценка:
Здравствуйте, culver, Вы писали:

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>И чего тольок не вписываю: ...

C>Пока ничего не помогло.

пока MSDN не почитаешь и не поможет

надо так:
// объявляем тип - указатель на функцию
typedef BOOL (__stdcall PMYFUNC)(LPSTR);
// объявляем переменную типа - указатель на функцию
PMYFUNC pMyFunc;
// получаем адрес функции
pMyFunc = (PMYFUNC)GetProcAddress(hInst,"StateOfPC"); 
// используем
pMyFunc ("Hello!!!");


Удачи.
ICQ #311116826
Re[2]: callback&dll
От: Аноним  
Дата: 05.02.03 14:35
Оценка:
Здравствуйте, Максим Алексейкин, Вы писали:

Да, забыл звёздочку
typedef BOOL (__stdcall *PMYFUNC)(LPSTR);
Re[3]: callback&dll
От: culver Украина  
Дата: 05.02.03 19:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Максим Алексейкин, Вы писали:


А>Да, забыл звёздочку

А>
А>typedef BOOL (__stdcall *PMYFUNC)(LPSTR);
А>


Если ВНИМАТЕЛЬНО прочитать мой пост, то там есть:
"И чего тольок не вписываю:... и typedef BOOL (__stdcall *cfunc___)(LPSTR);

Еще предложения будут?
Re: callback&dll
От: MaximE Великобритания  
Дата: 05.02.03 20:37
Оценка:
Здравствуйте, culver, Вы писали:


C>Пока ничего не помогло. Что дальше?


Что значит "ничего"? Не можешь получить адрес?
Re: callback&dll
От: Roman_M rgmroman.narod.ru
Дата: 06.02.03 09:01
Оценка:
Здравствуйте, 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
Re[2]: callback&dll
От: culver Украина  
Дата: 06.02.03 10:16
Оценка:
Здравствуйте, Roman_M, Вы писали:

RM>Может надо писать:

RM>GetProcAddress(hInst,"_StateOfPC@4");
все равно не помагает
RM>Актуально, если компилятор MSVC и нет def-файла
и это тоже не помагает

RM>Или может написать:
RM>*(LPVOID*)&state = GetProcAddress
вроде как что-то дает, уже ближе к жизни. А можно объяснить почему так пишется?
Re[4]: callback&dll
От: Максим Алексейкин Россия  
Дата: 06.02.03 10:33
Оценка:
Здравствуйте, culver, Вы писали:

C>Если ВНИМАТЕЛЬНО прочитать мой пост, то там есть:

C>"И чего тольок не вписываю:... и typedef BOOL (__stdcall *cfunc___)(LPSTR);

Ну, извини.

C>Еще предложения будут?


вопрос: зачем там это
extern "C"
ICQ #311116826
Re[2]: callback&dll
От: culver Украина  
Дата: 06.02.03 13:42
Оценка:
Здравствуйте, Roman_M, Вы писали:

RM>Или может написать:

RM>*(LPVOID*)&state = GetProcAddress
Это тоже чаво-то не того, так вроде как работает, но дает какую-то глупую ошибку 183:Cannot create a file when that file already exists. Причем тут это, файлов я не создаю.

Что ж это могет быть?
Re[3]: callback&dll
От: Roman_M rgmroman.narod.ru
Дата: 06.02.03 14:38
Оценка:
Здравствуйте, 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 * без проблем присваиваются другие типы указателей.

Вот работающий пример.
#include <windows.h>

extern "C" __declspec(dllexport) void __stdcall Message(LPTSTR lpszText)
{
 MessageBox(NULL, lpszText, TEXT("message"), MB_OK);
 }

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
 void (__stdcall *msg)(LPTSTR); 

 *(LPVOID*)&msg = GetProcAddress(hInstance, "_Message@4");
 if (msg == NULL)
    {
     TCHAR szText[0x10];

     wsprintf(szText, TEXT("Error: %d."), GetLastError());
     MessageBox(NULL, szText, NULL, MB_OK | MB_ICONERROR);

     return FALSE;
     }

 msg(TEXT("Hellow World."));

 return TRUE;
 }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.