VC显示链接Dll的检查

最近做程序需要使用LoadLibrary的方式加载动态库,步骤如下:

1. 使用LoadLibrary加载动态库。(遇到一个问题,见补充说明)

2. 然后使用GetProcAddress函数,获取动态库中的导出函数的地址。

接到 DLL GetProcAddress DLL 出函数的地址。使用返回的函数指针调 DLL 函数。GetProcAddress 将(由 LoadLibraryAfxLoadLibrary GetModuleHandle 返回的)DLL 句柄和要用的函数名或函数的出序号用作参数。

由于是通针调 DLL 函数并且没有编译时类检查,需确保函数的参数是正确的,以便不会超出在堆上分配的内存和不会访问冲突。确保型安全的一方法是出函数的函数原型,并建函数指的匹配 typedef例如:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"DLLFunc1");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
{
// call the function
uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
}
}
GetProcAddress 指定所需函数的方式取决于 DLL 的生成方式。

当要接到的 DLL 是用模 (.DEF) 文件生成的,并且序号在 DLL .DEF 文件的 EXPORTS 中与函数一起列出,才能出序号。如果 DLL 具有出函数,于使用函数名,使用出序号 GetProcAddress 的速度稍快一些,因为导出序号是 DLL 出表的索引。使用出序号,GetProcAddress 可直接定位函数,而不是将指定名称与 DLL 出表中的函数名行比。但是,当有控制 .DEF 文件中出函数的序号分配,才使用出序号 GetProcAddress

 

补充说明:

遇到问题描述:再链接一个Dll时,LoadLibrary在某些机器上返回失败,而某些机器上能返回成功。如果使用LoadLibraryEx函数,能加载成功,但是在使用时, 会出现莫名其妙的问题,例如string strText;这样的语句都会异常。

问题解决办法:使用VC6.0自带工具Depend.exe查找链接Dll时缺少的依赖的库。

Depend.exe使用方法:用其直接打开Dll即可。

这个方法是别人使用的,发现这个工具非常好用,发扬之……

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值