我知道有一个名为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文件,那么一切都很好.
我似乎无法评论他的答案(我需要更多的声誉?),但你可以尝试使用我的.dll包装器生成器来创建存根.dll iain建议.
我假设您想要在C/C++中调用dll中的某些函数/方法,而无需访问lib文件来链接它.
如果您知道所需功能的签名,您可以:
创建自己的dll存根版本
创建一个dll项目,其名称与您要使用的dll同名
添加要调用的函数的存根实现
签名非常重要,使用depends.exe或dumpbin.exe来检查它们是否匹配.
然后编写/构建程序以链接到存根dll
运行程序将stub dll替换为真实的dll