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

来源:互联网 发布:河南省卫生网络直报 编辑:程序博客网 时间:2024/06/06 12:27

静态加载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");中,没有给对函数名。又或者没有给对参数列表。

 

别的问题没有遇到过,暂时先不说了

 

原创粉丝点击