请高手指点程序有何问题,我做了一个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
注意Dll_Test.dll在哪个文件夹下。Top
保证dll在工程目录下
出错指什么错误?Top
看看你的dll路径是否正确Top
上面说得有道理
不过还有你的int Max()函数是不是加上标识为导出函数的标识Top
不要callback试试
typedef int(SQRTPROC)(int ,int);
SQRTPROC* lpfnDllFunc;
lpfnDllFunc = (SQRTPROC* )GetProcAddress(hDLL, "Max");Top
楼主最好用.def文件导出
避免编译器更改你的导出函数的名字。
另外,如果你的函数本身没有加调用约定,那么你用typedef定义函数指针的时候,也不要加。Top
typedef int(*AAA)(int ,int);
AAA lpfnDllFunc;
HINSTANCE hInst;
hInst = LoadLibrary("DemoDll.dll");
lpfnDllFunc = (AAA)GetProcAddress(hInst, 函数名);
lpfnDllFunc(a,b);
Top
用dumpbin.exe(vc里有)看看动态库导出的函数名被改成了什么。Top
hDLL = LoadLibrary("Dll_Test.dll");
这句话你还是使用绝对路径吧!
Top
你以上的代码有以下几个不妥的地方:
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
其实我已经声明了,可是忘了写了,如下:
extern "C"_declspec(dllimport) int Max(int a,int b);
最后原因把callback去掉就好使了,谢谢各位!Top
Ok