无法启动程序 “E:\练习DLL程序\DLLtest\Debug\DLLtest.dll”

来源:互联网 发布:网络在线客服好当吗 编辑:程序博客网 时间:2024/06/06 09:38

      最近尝试这写了一个DLL程序,基本上全部是按照书上的要求进行写的,但还是出现了错误。我想着应该很正常吧,所谓“纸上得来终觉浅,绝知此事要躬行”。其中出现的错误就是“无法启动程序 “E:\练习DLL程序\DLLtest\Debug\DLLtest.dll” ”。

       我觉得事先需要说明的一点是:DLLtest是我建的DLL项目,test是我建的需要用到动态链接库DLLtest的项目 。

       碰到这个问题后第一个去问的就是百度,百度上给了一个说法是DLLtest项目build之后所生成的DLLtest.dll文件并没有放到test.exe文件所在的文件夹里面。但是我的是放进去了的,不过还是有问题。至于说为什么需要将DLLtest4.dll文件放到运行文件所在的文件夹,Visual C++ 2010 入门经典(第五版)给出了明确的解释:当程序执行时,要使Windows为程序查找并加载一个DLL,通常要把这个DLL放在Windows System32文件夹中。如果DLL不在这个文件夹中,那么Windows将搜索包含可执行文件(这里是test.exe文件)所在的文件夹。如果没有找到,就会出现一个错误消息。

        言归正传,还是说这个问题是怎么解决的吧。后来在我无意中将E:\练习DLL程序\DLLtest\Debug\DLLtest.dll添加到了test项目-属性-配置属性-连接器-输入-附加依赖项。在连接的时候很显然的出现了问题,因为是应该把build之后的DLL项目Debug文件夹下DLLtest.lib文件夹添加到附加依赖项的。但是问题的报错内容却引发了我的思考,错误内容是:E:\练习DLL程序\DLLtest\Debug\DLLtest.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x2F0 处读取。当我看到这个错误后我想不会是我的DLLtest项目的错误吧。。。。无论如何分为两种情况:第一是我程序写的有问题。第二是文件确实无法正确的打开,至于原因是什么我就不知道了。仔细检查过自己的程序后发现没有错误,后来百度一下。里面也是众说纷纭,关于是第一种情况的解决办法是因为在test项目的主程序中没有加#pragma comment(lib,"WS2_32.LIB"),我写的程序很简单,就是简单的字符串输出,平常写的程序就没有添加#pragma comment(lib,"WS2_32.LIB"),我认为错误应该不是在没有添加上面那句话程序,结果试了试,确实还是不行。甚至还有的说是要加上这样的代码#pragma comment(lib,"E:\练习DLL程序\DLLtest\Debug\DLLtest.LIB")在test项目主函数之前。然后我又仔细的查看了Visual C++ 2010 入门经典(第五版),书中比没有对此操作做介绍,而且在添加外部依赖项的时候,已经明确的给出了.lib文件的路径,就像你需要调用printf()函数一样,你只需要先#include “stdio.h”即可,相同的原理我想要调用我自己写的DLL里面的东西,也是应该只需要包含相应的头文件就行了,即#include "DLLtest.h"。试验之后发现上面说的加#pragma comment(lib,"E:\练习DLL程序\DLLtest\Debug\DLLtest.LIB")的方法也是错误的。然后就是第二种情况的,百度上有的说是因为磁盘的问题,但是按照相应的说法改过之后还是不行。后来还有一种说法是,在解决法案-属性-通用属性-外部依赖项,将DLLtest项目设置为test项目的外部依赖,但很显然也不像是正解,因为系统中那么多DLL都不在当前解决方案里面,没有设置外部依赖项,不还是能够调用嘛,不过话说回来,系统是系统的,可能有好多自己不知道的东西,所以试了试,结果还是不行。后来无意中看到了解决方案-属性-通用属性-启动项目,竟然默认为在此解决方案中中的第一个项目DLLtest。。。。。。但是我恍然大悟,错误原来是在这里,.dll文件应该无法运行才对(这句话是否正确有待考证)。然后在默认启动项下将test项目设置为默认启动项就好了。

        ╮(╯▽╰)╭,其实这个错误很低级的,但是有的时候确实很难发现,希望能够给那些学习DLL的菜鸟(本人就是)带来一些帮助。
0 0
原创粉丝点击