用LoadLibrary和GetProcAddress函数调用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