我是Windows概念的新手。我正在尝试开发一个动态链接其他DLL的DLL。我正在使用Visual Studio 2010.在链接时,Visual Studio告诉我它正在尝试链接一堆.lib文件。我不认为Visual Studio应该尝试读取任何.LIB文件,如果我希望我的代码执行动态链接是正确的吗?或者我不明白使用.LIB文件吗?
谢谢
答案 0 :(得分:4)
我的理解,你有点困惑,因为你想使用DLL而不是LIB。
诀窍是Kernel32.Lib,User32.Lib,AdvAPI32.Lib等没有您使用的函数的实现。此外,如果在程序中使用CreateFileW
或MessageBoxW
等函数,则在编译后将无法解析对该函数的引用。因此,如果没有LIB,未解析的引用也将保留在EXE中。这将是坏事。为了可执行,EXE必须已经解析了所有外部引用,而且确切地知道应该在哪些DLL中找到哪些函数。所以命名导入库有助于解决问题。例如,导入库Kernel32.Lib包含有关CreateFileW
函数的信息,User32.Lib包含有关MessageBoxW
的信息。如果您使用像Kernel32.Lib,User32.Lib,AdvAPI32.Lib这样的导入库列表,您的EXE会解析所有引用的并包含所需的DLL的确切列表以及相应DLL中使用的函数列表中的一个特殊的导入表(请参阅http://en.wikipedia.org/wiki/Portable_Executable#Import_Table,http://msdn.microsoft.com/en-us/library/ms809762.aspx和http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx)。因此,如果一个人启动你的EXE,操作系统会将DLL加载到进程的地址空间中并解析直到最后所有引用都直到所有使用的函数的地址。
通常,编译DLL时,链接器( link.exe )将创建导入库。也可以创建一个导入库,该库对应于 lib.exe 实用程序的DLL。 (见http://msdn.microsoft.com/en-us/library/0b9xe492.aspx)
答案 1 :(得分:1)
我记得,Visual Studio的编译器通过链接存根.LIB文件来解析.DLL文件。
检查,其中一个应该是kernel32.lib。