Войти

Показать полную графическую версию : [решено] Не работает GetProcAddress


Arrest
12-11-2008, 21:09
Пытаюсь подключить DLL такого вида:
#include "main.h"
#include <windows.h>
#include <stdio.h>

// [skipped]

BOOL __declspec(dllexport) init(){
MessageBoxA(0, "Hello!", "DLL activated", 64);
}

BOOL __declspec(dllexport) deinit(){
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;
}
К такому коду:
#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
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
Delirium, без него тоже все работает функция DLLMain является опциональной вообще, если смотреть на MSDN

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




© OSzone.net 2001-2012