今天遇到一个客户需要使用我们的动态库,但是声明只要Dll和头文件(函数声明),别的都不用,lib也不用,客户之所以要这样,是因为他们之前用的动态库的调用方式也是这样的,于是我就赶紧查找了一些关于动态库动态调用的资料,因为用到了,就想记下来了,呵呵~~~~
动态库名:cdll5.dll
函数原型:unsigned long FunctionTest(unsigned long Rand);(该函数为动态库中函数)
函数导出声明:unsigned long FAR __stdcall FunctionTest(unsigned long Rand);
调用开始:
首先宏定义函数指针
typedef unsigned long (WINAPI* LockFunction)(unsigned);(这里的返回值和参数都应该和动态库中的声明保持一致)
LockFunction aaa;//声明变量
HINSTANCE hload;//LoadLibrary返回的句柄
CString str;
hload=LoadLibrary("cdll5.dll");//载入动态库,路径为当前目录
if (hload!=NULL)
{
aaa=(LockFunction)GetProcAddress(hload,"FunctionTest");//在动态库中查找FunctionTest对应的函数
if (aaa!=NULL)
{
unsigned long ret=aaa(12345);
str.Format("%d",ret);
MessageBox(str);
}
FreeLibrary(hload); //释放
}
在宏定义函数指针的时候加了WINAPI*,开始没加的时候编译连接通过,但是一运行代码程序就死掉了,断点调试发现运行到
unsigned long ret=aaa(12345);
程序就死掉了,不知道什么原因,希望能有高手给指明原因,先谢谢了,后来加上WINAPI*之后就没问题了
参考资料:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007921/72754.html