邪恶八进制信息安全团队技术讨论组's Archiver

lfq7413 2007-10-7 10:15

[讨论]DLL问题待解决

议题作者:lfq7413
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

本人初学DLL编程~遇到了不少问题~高手看下~

test1.DLL test.exe

下面是test1.DLL的代码~

[code]#include <windows.h>

_declspec(DLLexport) void manage()
{
  MessageBox(0,"The Fun manage","HI",MB_OK);
  return;
}

BOOL APIENTRY DLLMain(HINSTANCE hinstDLL,DWORD fdwReason,PVOID fImpload)
{
  switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
      MessageBox(0,"test1 ATTACH","HI",MB_OK);
    default:
      break;
    }
  return TRUE;
}[/code]
编译通过,无错误~

test.exe的代码~

[code]#include <windows.h>

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
  HINSTANCE hDLL;
  FARPROC funAddr;
  hDLL=LoadLibrary("test1.dll");
  if(!hDLL)
  {
    MessageBox(0,"wroing","HI",MB_OK);
    exit(1);
  }
  funAddr=GetProcAddress(NULL,"manage");
  (*funAddr)();//**************************问题可能在这~
  MessageBox(0,"HI","HI",MB_OK);
  return TRUE;
}[/code]

编译通过,也无错误,但是在运行test.exe是却总是显示“test.exe遇到问题需要关闭”

在将(*funAddr)();注释掉之后,又可以正常显示下面的MessageBox,

不知道出错在哪儿~~我是用MinGW编译的~~~

请高手帮忙解决一下~

drizt 2007-10-11 22:04

GetProcAddress函数第一个参数是包含获取函数的模块名,所以
funAddr=GetProcAddress(hDLL,"manage");

就行,至于是不是(*funAddr)();的问题,很好判断,在
funAddr=GetProcAddress(NULL,"manage");
后判断一下funAddr就行了

achillis 2007-10-12 16:41

这个问题之前我刚好碰到过.
void manage() 这个是你DLL中函数的原型.
那么在test.exe的代码中这样定义:typedef void (MYFUN *)(void);
然后下面这样写:
MYFUN funAddr=(MYFUN)GetProcAddress(hDLL,"manage");//这里句柄必须得是test.dll的句柄
然后调用funAddr()就可以了.

页: [1]
© 1999-2008 EvilOctal Security Team