Есть собственноручно написанная DLL,есть код который загружает эту самую dll, но вот в чем проблема dll грузится нормально, но GetProcAddress возвращает всё время NULL, вот исходник
//DLL:
BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
{
return TRUE;
}
extern "C"
{
__declspec(dllexport) void __stdcall MyFunction(char* chrMessage)
{
MessageBox(NULL,chrMessage,"Hello World",MB_OK);
}
}
//Использование DLL:
typedef void (_stdcall *My_Dll_Proc_Type)(char*);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HINSTANCE hMyDll = ::LoadLibrary("MyDLL");
My_Dll_Proc_Type My_Proc = (My_Dll_Proc_Type)::GetProcAddress(hMyDll,"MyFunction");
FreeLibrary(hMyDll);
return 0;
}
Подскажите что не так в этом коде, или приведите пример как это правильно делается. Заоранее благодарен
Здравствуйте, mixrya, Вы писали:
M> skip
Функция експортируется под именем _MyFunction@4. Соответственно MyFunction в твоей длл нет.
Чтобы функция экспортировалась без декораций пиши так:
extern "C"
{
__declspec(dllexport) void MyFunction(char* chrMessage)
{
MessageBox(NULL,chrMessage,"Hello World",MB_OK);
}
}
или используй *.def-файл.
Tip на будущее: в составе PlatformSDK и VisualStudio есть утилиты dumpbin и dependse с помощью которых можно посмотреть что длл экспортирует и импортирует и под какими именами
Здравствуйте, mixrya, Вы писали:
M>Есть собственноручно написанная DLL,есть код который загружает эту самую dll, но вот в чем проблема dll грузится нормально, но GetProcAddress возвращает всё время NULL, вот исходник
M>M>//DLL:
M>BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
M>{
M> return TRUE;
M>}
M>extern "C"
M>{
M> __declspec(dllexport) void __stdcall MyFunction(char* chrMessage)
M> {
M> MessageBox(NULL,chrMessage,"Hello World",MB_OK);
M> }
M>}
M>//Использование DLL:
M>typedef void (_stdcall *My_Dll_Proc_Type)(char*);
M>int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
M>{
M> HINSTANCE hMyDll = ::LoadLibrary("MyDLL");
M> My_Dll_Proc_Type My_Proc = (My_Dll_Proc_Type)::GetProcAddress(hMyDll,"MyFunction");
M> FreeLibrary(hMyDll);
M> return 0;
M>}
M>
M>Подскажите что не так в этом коде, или приведите пример как это правильно делается. Заоранее благодарен
Проблема в опции _stdcall, данный пример будет работать, если экпотртируемую функцию объявить как _cdecl)
Для вашего случая нужно сделать вот так
My_Dll_Proc_Type My_Proc=(My_Dll_Proc_Type)::GetProcAddress(hMyDll,"MyFunction@4");
Рекомендую почитать статейки в MSDN по поводу экпорта из DLL функций.
2 ответа, оба с ошибками

во1ых, утилита depends.exe покажет точные имена всех экспортов.
во2ых, имя экспорта в примере — "_MyFunction@4"
Здравствуйте, mixrya, Вы писали:
M>Есть собственноручно написанная DLL,есть код который загружает эту самую dll, но вот в чем проблема dll грузится нормально, но GetProcAddress возвращает всё время NULL, вот исходник
M>M>//DLL:
M>BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
M>{
M> return TRUE;
M>}
M>extern "C"
M>{
M> __declspec(dllexport) void __stdcall MyFunction(char* chrMessage)
M> {
M> MessageBox(NULL,chrMessage,"Hello World",MB_OK);
M> }
M>}
M>//Использование DLL:
M>typedef void (_stdcall *My_Dll_Proc_Type)(char*);
M>int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
M>{
M> HINSTANCE hMyDll = ::LoadLibrary("MyDLL");
M> My_Dll_Proc_Type My_Proc = (My_Dll_Proc_Type)::GetProcAddress(hMyDll,"MyFunction");
M> FreeLibrary(hMyDll);
M> return 0;
M>}
M>
M>Подскажите что не так в этом коде, или приведите пример как это правильно делается. Заоранее благодарен