静态链接的应用程序 - 无效或损坏的DLL

时间:2010-02-01 18:51:51

标签: windows visual-studio winapi dll compiler-construction

我有一个使用winInet类的应用程序 - #include <afxinet.h>wininet.dll

我想在我的应用程序和dll中静态链接WinInet函数调用,所以我跟着these steps。然后,当我阅读here时,我将wininet.dll复制到我的项目目录中。

构建后,我收到以下错误 - wininet.dll : fatal error LNK1136: invalid or corrupt file

我的第一个问题是:
- 我正确地做了我认为静态链接函数调用和dll的内容吗? - 如果是这样,为什么dll会因此设置而损坏,但没有这些更改会有效?

感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:3)

您不应该直接链接到DLL。相反,链接到相应的导入库(应该是Wininet.lib)。当然,DLL仍然需要在运行时访问您的应用程序。链接器需要.lib文件来设置与DLL的正确链接。

  

我是否正确地执行了我认为静态链接函数调用和dll的内容?

您正在做的通常称为动态链接(或多或少动态..),但它(afaik)是Windows系统API的唯一方法。 “静态”链接会将Wininet代码直接嵌入到您的可执行文件中,而不需要外部DLL。

答案 1 :(得分:3)

“静态链接”是将代码包含在应用程序中的过程。本质上,DLL是一个动态链接库,因此没有,包括应用程序目录中的DLL不是静态链接 - 它仍然是动态的。将它放在应用程序目录中的原因是应用程序可以在不需要安装的情况下找到它。

我不认为它是“腐败”的DLL - 我怀疑你试图将DLL静态链接到应用程序,这是不可能发生的。你需要包含正确的.lib文件,无论是什么,在链接的附加库中,并确保你链接的lib文件不是wininet.dll的DLL导出包

答案 2 :(得分:1)

当您链接DLL时,有一个相应的LIB文件用于设置与函数的正确链接。例如,如果您使用的是USER32.DLL和KERNEL32.DLL,则需要链接的相应LIB将是USER32.LIB和KERNEL32.LIB。

有时情况不是那么明显,您可以通过查看相关功能的MSDN进行仔细检查,当您向下滚动到该页面的底部时,它会告诉您要链接的库,例如,在Win32API的CreateProcess中,当您查看页面底部时,它会告诉您要使用的库是什么,在这种情况下它是KERNEL32.LIB。

您刚刚在链接器阶段引用了DLL,链接器无法理解DLL,因为它已经是一个已编译的库,因此链接器抱怨它“已损坏”。

将其更改为WinInet.LIB,一切正常。

希望这有帮助, 最好的祝福, 汤姆。