您的位置:首页 > 编程语言

用LoadLibrary和GetProcAddress函数调用dll的代码有问题

2009-06-27 10:14 295 查看

用LoadLibrary和GetProcAddress函数调用dll的代码有问题,希望高手指点(谢谢)!

楼主
wangzi163(甲骨文)
2005-04-02 14:12:01 在 VC/MFC / 进程/线程/DLL 提问

请高手指点程序有何问题,我做了一个dll文件想用显示的方式调用,就是用LoadLibrary和GetProcAddress函数实现,可是运行总是出错。

程序代码如下:

//Dll_Test.cpp 生成Dll_Test.dll

#include "stdafx.h"

#include "Dll_Test.h"

int Max(int a, int b)

{

if(a>b)

return a;

else

return b;

}

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

//Test_GetMax.cpp

#include "stdafx.h"

#include <stdio.h>

#include <afxwin.h>

#include <afxext.h>

#include <afxdisp.h>

#include <afxdtctl.h>

int main(int argc, char* argv[])

{

typedef int (CALLBACK* LPFNDLLFUNC)(int ,int);

HINSTANCE hDLL;

LPFNDLLFUNC lpfnDllFunc;

hDLL = LoadLibrary("Dll_Test.dll");

if (hDLL != NULL)

{

lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hDLL, "Max");

if (!lpfnDllFunc)

{

FreeLibrary(hDLL);

}

else

{

printf("已经找到函数");

int a;

a = lpfnDllFunc(1,2);

printf("返回直:%d",a);

}

}

return 0;

}

问题点数:100、回复次数:12
Top

1 楼
louifox(兰陵笑笑生)

回复于 2005-04-02 14:41:24 得分 5

注意Dll_Test.dll在哪个文件夹下。Top

2 楼
oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)

回复于 2005-04-02 15:01:31 得分 2

保证dll在工程目录下

出错指什么错误?Top

3 楼
legendhui(秋天的叶子)

回复于 2005-04-02 15:27:24 得分 2

看看你的dll路径是否正确Top

4 楼
wenxinfly(文心)

回复于 2005-04-02 15:36:54 得分 2

上面说得有道理

不过还有你的int Max()函数是不是加上标识为导出函数的标识Top

5 楼
laiyiling(陌生人[MVP])

回复于 2005-04-02 20:31:20 得分 50

不要callback试试

typedef int(SQRTPROC)(int ,int);

SQRTPROC* lpfnDllFunc;

lpfnDllFunc = (SQRTPROC* )GetProcAddress(hDLL, "Max");Top

6 楼
kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)

回复于 2005-04-02 20:36:15 得分 10

楼主最好用.def文件导出

避免编译器更改你的导出函数的名字。

另外,如果你的函数本身没有加调用约定,那么你用typedef定义函数指针的时候,也不要加。Top

7 楼
wellin()

回复于 2005-04-02 23:55:01 得分 20

typedef int(*AAA)(int ,int);

AAA lpfnDllFunc;

HINSTANCE hInst;

hInst = LoadLibrary("DemoDll.dll");

lpfnDllFunc = (AAA)GetProcAddress(hInst, 函数名);

lpfnDllFunc(a,b);

Top

8 楼
tankbattle(坦克大战)

回复于 2005-04-03 00:44:50 得分 3

用dumpbin.exe(vc里有)看看动态库导出的函数名被改成了什么。Top

9 楼
redkit(ChinaYan)

回复于 2005-04-03 12:49:00 得分 2

hDLL = LoadLibrary("Dll_Test.dll");

这句话你还是使用绝对路径吧!

Top

10 楼
sambios(雨雪逝去)

回复于 2005-04-03 15:41:04 得分 4

你以上的代码有以下几个不妥的地方:

1)没有说明要导出什么函数。

2)缺少.def文件。

以下是更正的文件内容:

dll中的函数改为以下代码:

extern "C" __declspec(dllexport) int __stdcall Max(int a, int b)

{

if(a>b)

return a;

else

return b;

}

//以下是test.def文件内容:

EXPORTS

Max

//:~

主函数不用修改。这样就没有问题了。

Top

11 楼
wangzi163(甲骨文)

回复于 2005-04-03 19:20:23 得分 0

其实我已经声明了,可是忘了写了,如下:

extern "C"_declspec(dllimport) int Max(int a,int b);

最后原因把callback去掉就好使了,谢谢各位!Top

12 楼
robot1980(往事如风)

回复于 2005-06-06 14:47:36 得分 0

Ok
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: