Проблема с DLL
От: mixrya  
Дата: 06.06.05 06:02
Оценка:
Есть собственноручно написанная 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;
}


Подскажите что не так в этом коде, или приведите пример как это правильно делается. Заоранее благодарен
Re: Проблема с DLL
От: jedi Мухосранск  
Дата: 06.06.05 06:24
Оценка:
Здравствуйте, 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 с помощью которых можно посмотреть что длл экспортирует и импортирует и под какими именами
Re: Проблема с DLL
От: avs.prg Украина  
Дата: 06.06.05 06:28
Оценка:
Здравствуйте, 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 функций.
Re: Проблема с DLL
От: aik Австралия  
Дата: 06.06.05 06:40
Оценка:
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>Подскажите что не так в этом коде, или приведите пример как это правильно делается. Заоранее благодарен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.