Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Не работает GetProcAddress (http://forum.oszone.net/showthread.php?t=122752)

Arrest 12-11-2008 21:09 950966

Не работает GetProcAddress
 
Пытаюсь подключить DLL такого вида:
PHP код:

#include "main.h"
#include <windows.h>
#include <stdio.h>

// [skipped]

BOOL __declspec(dllexportinit(){
     
MessageBoxA(0"Hello!""DLL activated"64);
}

BOOL __declspec(dllexportdeinit(){
     
MessageBoxA(0"Bye!""DLL disactivated"64);
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       
DWORD reason        /* Reason this function is being called. */ ,
                       
LPVOID reserved     /* Not used. */ )
{
    switch (
reason)
    {
      case 
DLL_PROCESS_ATTACH:
        break;

      case 
DLL_PROCESS_DETACH:
        break;

      case 
DLL_THREAD_ATTACH:
        break;

      case 
DLL_THREAD_DETACH:
        break;
    }

    
/* Returns TRUE on success, FALSE on failure */
    
return TRUE;


К такому коду:
PHP код:

#include <windows.h>

typedef BOOL (CALLBACK *inshook)(); 

int WINAPI WinMain (HINSTANCE hThisInstance,
                    
HINSTANCE hPrevInstance,
                    
LPSTR lpszArgument,
                    
int nFunsterStil)

{
    
HMODULE DllInstance;
    
inshook init
    
DllInstance LoadLibrary("hooklib.dll");
    if(
DllInstance == NULL){
        
MessageBoxA(0"Failed to run DLL""Error"16);
        
ExitProcess(0);
    }
    
init = (inshook)GetProcAddress(DllInstance"installhook");
    if(
init == NULL){
        
MessageBoxA(0"Failed to determine DLL function adress""Error"16);
    }else{
        
init();
    }
    
FreeLibrary(DllInstance);
    
ExitProcess(0);


Не работает. GetProcAddress отдает нулевой указатель. Что надо пофиксить?

P.S. Dev-C++, mingw

Delirium 13-11-2008 01:04 951174

Цитата:

Цитата Arrest
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
} »

а default в конце switch не нужен?

Arrest 13-11-2008 15:21 951595

Delirium, без него тоже все работает функция DLLMain является опциональной вообще, если смотреть на MSDN

Проблема решена: если точно экспортная функция никак не находится GetProcAddress'ом, то стоит посмотреть Dependency Walker'ом ее имя, которое сделал компилятор. В моем случае было что-то вроде _Z4installhook.


Время: 14:46.

Время: 14:46.
© OSzone.net 2001-