您的位置:首页 > 其它

静态加载dll,动态加载dll及常见问题处理

2013-09-10 17:38 351 查看
静态加载dll(原材料:dll.dll,dlDef.h,dll.lib)

将.lib加入工程,dll丢到exe的位置。之后调用函数的方式就是::FuncName(veriable, veriable,....,veriable)

动态加载dll(原材料:dll.dll,dllDef.h)

第一步:得到句柄

将dll丢到exe位置,然后调用

string fileName = “...";

HMODULE hDll = LoadLibraryEx(fileName.c_str(),0,LOAD_WITH_ALTERED_SEARCH_PATH);

// 用Ex函数的好处是,当多个dll之间互相依赖时,LoadLiabrary可能找不到依赖项,导致无法加载。

第二步:声明函数指针

int (__cdecl *FuncName)(char* ,char* ,char*); // 这里的参数设置需要和”dllDef.h“ 一致

FuncName= (int (_cdecl*)(char* ,char* ,char* ))GetProcAddress((HMODULE)hDll,"FuncName");

第三步:调用函数

int ret = FuncName(variable 1,variable 2,variable 3);



动态加载dll见到过的问题及解决方法

1.hDll == NULL,dll加载失败

可能原因:1.dll路径没弄对。

2.dll的依赖项没有放进去,看是不是缺项的方法是用Depends工具打开该dll,看看是不是有些依赖项是黄的。若缺,需要补上,直到dll依赖列表中无异常颜色为止。

2.1 根据缺失情况:若是MSVCR80.DLL,MFC80.DLL之类的,不需下载,在自己的vs的安装目录下面就有,搜索就能得到。

2.2 自己定义的dll缺失了,这个就要自己加了。

3. 如果上面两类原因都排除了,很可能是自己写的其他依赖dll没有及时更新,或者MFC80.DLL之类的没找对。后者需要根据自己机器型号来找。如32位系统就找带x86字样目录下的dll



2.FuncName == NULL

可能是在第一步的GetProcAddress((HMODULE)hDll,"FuncName");中,没有给对函数名。又或者没有给对参数列表。



别的问题没有遇到过,暂时先不说了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: