首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

VS加载动态库DLL的简单有关问题

2013-02-03 
VS加载动态库DLL的简单问题。我用的是最简单的加载方法,直接把lib和dll都放到工程项目中。先说说加载静态库

VS加载动态库DLL的简单问题。
我用的是最简单的加载方法,直接把lib和dll都放到工程项目中。
先说说加载静态库的方法:
把lib放到工程项目中,然后在附加目录中加入静态库头文件的路径,就基本完成了。

问题是:
难道加载动态库的步骤仅仅是在加载静态库后,把dll复制到工程项目中就完事了?不用配置其他东西了?
我用的编译器是VS2008.

难道:不复制dll进工程项目中,就是静态加载,把dll复制进去就可以运行时加载了??

-----------------------
那我如何知道是否加载动态库成功呢?即使不复制dll到工程项目中,程序同样能运行(因为静态库本来就配置好了) dll 加载动态库
[解决办法]
程序在运行时,会自动按照一定的顺序搜索几个特定的文件夹,包括“可执行文件所在的文件夹”和“系统动态库存放文件夹”等
如果在这些地方找不到所需的动态链接库,则程序无法启动
如果在一个文件夹内找到了所需的动态链接库,则不再继续寻找

“即使不复制dll到工程项目中,程序同样能运行”
这说明,“复制dll到工程项目中”是一个毫无意义的行为
为什么能运行?一般来说,是因为这个dll在你安装驱动或软件的时候已经被复制到了系统动态库存放文件夹,一般是c:\windows\system32\

[解决办法]
生成动态库DLL的时候,配套生成的.lib并不是静态库,而是此DLL的符号链接库。
楼主所说的链接方式,并不是动态加载DLL文件。
因为使用了.lib文件,所以是静态加载动态库,此时加载模块会在PE头中加入相关信息,加载模块启动时如果找不到DLL文件,则此模块无法启动。
使用LoadLibrary+GetProcAddress函数加载DLL,才是[color=#FF0000动态加载动态库[/color],这种方式加载动态库,不会在PE头中添加相关信息,所以加载模块即使找不到DLL文件,仍可正常启动,但涉及DLL的函数都无法正常使用。

热点排行