当前位置:  开发笔记 > 编程语言 > 正文

为Windows C++ Visual Studio 2008将Windows Dll转换为.lib

如何解决《为WindowsC++VisualStudio2008将WindowsDll转换为.lib》经验,为你挑选了2个好方法。

我知道有一个名为Dll to lib的工具,但开发人员要求1000美元.我只需要转换一个库一次,所以不容易证明这个价格.

我尝试了IMPLIB32.EXE,但我只是得到空的.lib文件.我怎么能做到这一点?也许我可以写一个简单的转换应用程序?

Added1:

Dll通常是stdcall而不是cdecl,用旧的C语言编写,而不是C#或.NET或C++.我现在需要从C++应用程序中调用它们.一个例子是SQLite.dll或zlib.dll.我无法访问这些dll的.lib文件.

Added2:

我为VS2008重新编写了这段代码 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/, 并在此处下载了可下载的示例Dll等:http: //www.transferbigfiles.com/Get .aspx?id = 7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a 这反过来又创建了一个创建Dll的项目.当我尝试编译Dll时,我收到链接器错误:AddShow.dll:致命错误LNK1107:文件无效或损坏:无法在0x300读取此处描述:http://list.isis.vanderbilt.edu/pipermail/udm-users /2006-March/000664.html 不确定如何继续.到目前为止如此接近

接下来我们转到这个方法

http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

运行dumpbin参数/ exports C:\ path\to\AddShow.dll绝对没有做过一些研究

http://msdn.microsoft.com/en-us/library/aa446532.aspx 似乎需要从common/ide文件夹中找到mspdb71.dll(现在是mspdb80.dll),dumpbin.exe现在运行时出错:

致命错误LNK1106:无效文件或磁盘已满:无法寻求0x6179A这些线程表明dumpbin.exe的版本可能是问题

我有Microsoft(R)COFF/PE Dumper版本9.00.30729.01

所以我尝试了Microsoft(R)COFF二进制文件转储器版本5.12.8078但没有成功.经过多次阅读后,我不再接近了

http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal -错误- lnk1106,无效的文件,磁盘full.html

当我运行ProcMon时,我看到第一次出现queryopen和sqlite3.dll,当svchost.exe尝试打开它时失败,错误路径未找到.路径是C:\ Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL并且是正确的.如果我把它放在C盘的根部,那么我得到NAME NOT FOUND错误:

C:\ Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe.Local

C:\ Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe.Local

从link.exe和dumpbin.exe分别.我使用XPSP3而不是Vista,这是我对sysinternals的限制.什么是这些.local文件?

(csrss.exe也无法找到一些清单文件.)

所以没有成功,只是更神秘

补充3:

我试图从其安装位置\ Program Files\Microsoft Visual Studio 8\VC\bin运行dumpbin.exe,但操作系统说它无法找到mspdb80.dll.我从\ Program Files\Microsoft Visual Studio 8\Common7\IDE复制了mspdb80.dll,试图让dumpbin.exe运行.

现在我收到错误:"c1902程序数据库管理器不匹配,请检查您的安装"

如果我从\ Program Files\Microsoft Visual Studio 8\VC\bin中删除mspdb80.dll,则错误消失!但是我无法运行dumpbin.exe.

补充4:

我终于能够通过将以下文件复制到文件夹来运行dumpbin:

dumpbin.exe link.exe lib.exe mspdb80.dll

我确实得到了错误:

致命错误LNK1248:图像尺寸(FFFFFXXX)超出最大允许尺寸(80000000)

曾经,但更换了固定的DLL.据推测它已经腐败了?

然后我转到说明书的下一步: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/ http://支持.microsoft.com/kb/131313 并得到错误:忽略目标平台不支持的警告lnk4017语句这原来是因为我指定了.dll而不是.def文件.

然后将生成的.Lib和.exp文件添加到VS2008项目中并编译并运行.然后调试器报告错误:运行时检查失败#0 - ESP的值未在函数调用中正确保存...

正如在这里提到的 "运行时检查失败#0 - 在函数调用中没有正确保存ESP的值"从GameSpy lib的C++代码成功进行C#回调之后 这是因为我在我的dll中使用了stdcall并在我的dll中声明了__cdecl应用程序.

extern "C" { // put Dll C function prototypes here
 int __cdecl AddTwoNum(int n, double f); // __stdcall
}

因此,将此更改为__stdcall应该可以解决它你会想到的问题......但是没有.

现在我收到一个链接错误:错误LNK2001:未解析的外部符号_AddTwoNum @ 12

由于某种原因,这是一个装饰的函数名称.为什么?

添加了n:

原来这是因为.lib文件是使用带有STDCALL函数的dll创建的.STDCALL要求调用者清理堆栈,以便使用@符号将参数的字节数附加到函数名称.在这种情况下,我有三个4Byte iintegers,总共12个字节.

一旦我从使用CDECL调用约定创建的dll重新创建.lib文件,那么一切都很好.



1> 小智..:

我似乎无法评论他的答案(我需要更多的声誉?),但你可以尝试使用我的.dll包装器生成器来创建存根.dll iain建议.



2> iain..:

我假设您想要在C/C++中调用dll中的某些函数/方法,而无需访问lib文件来链接它.

如果您知道所需功能的签名,您可以:

创建自己的dll存根版本

创建一个dll项目,其名称与您要使用的dll同名

添加要调用的函数的存根实现

签名非常重要,使用depends.exe或dumpbin.exe来检查它们是否匹配.

然后编写/构建程序以链接到存根dll

运行程序将stub dll替换为真实的dll

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有