我知道有一个名为Dll的工具,但开发人员要求$ 1000。 我只需要将一个库转换一次,所以这个价格不太合理。
我试过IMPLIB32.EXE,但我只是得到空的.lib文件。 我怎样才能做到这一点? 也许我可以写一个简单的转换应用程序?
Added1:
Dll的通常是stdcall而不是cdecl,而不是用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这反过来又使一个项目,创build一个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/
运行参数/出口C:\path\到\ AddShow.dll dumpbin绝对没有什么经过一番研究
http://msdn.microsoft.com/en-us/library/aa446532.aspx它似乎mspdb71.dll(现在mspdb80.dll)是需要从common / ide文件夹dumpbin.exe现在运行错误:
致命错误LNK1106:无效文件或磁盘已满:无法find0x6179A这些线程表明dumpbin.exe的版本可能是问题
我有Microsoft(R)COFF / PE Dumper Version 9.00.30729.01
所以我试着微软(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时,我看到svchost.exe尝试打开它时遇到queryopen和sqlite3.dll的第一个问题,并导致错误PATH NOT FOUND失败。 path是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也无法find一些清单文件。)
所以没有成功,只是更多的奥秘
新增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程序数据库pipe理器不匹配请检查您的安装”
如果我从\ 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:// support .microsoft.com / kb / 131313并得到了错误:目标平台不支持警告lnk4017语句忽略这原来是因为我指定.dll而不是.def文件。
然后将生成的.Lib和.exp文件添加到VS2008项目并编译并运行。 debugging器然后报告错误:运行时检查失败#0 – ESP的值没有正确保存在函数调用…
正如在这里提到的“运行时检查失败#0 – ESP的值没有正确保存在一个函数调用”成功的C#callback从GameSpy库的C代码后,这是因为我用stdcall在我的DLL和声明__cdecl在我的应用程序。
extern "C" { // put Dll C function prototypes here int __cdecl AddTwoNum(int n, double f); // __stdcall }
所以改变这个__stdcall应该修复它你会认为..但唉不。
现在我得到一个链接错误:错误LNK2001:无法parsing的外部符号_AddTwoNum @ 12
由于某种原因,这是一个装饰的function名称。 为什么?
新增n:
那么这原来是因为.lib文件是使用STDCALL函数的dll。 STDCALL要求调用者清理堆栈,以便使用@符号将参数的字节数附加到函数名称。 在这种情况下,我有三个4Byte iintegers共12个字节。
一旦我从CDECL调用约定创build的DLL重新创build.lib文件,然后一切都很好。
我似乎无法评论他的答案(我需要更多的声誉?),但您可以尝试使用我的.dll包装生成器创建存根.dll iain建议。
我假设你想在C / C ++中调用DLL中的某些函数/方法,而无需访问lib文件来链接它。
如果您知道所需功能的签名,则可以:
你也可以用动态的方式,使用LoadLibrary()和GetProcAddress() 。
(请参阅第二个链接的例子)。
在zlib或sqlite的情况下,您可以直接下载源代码并编译自己的lib文件。 其实我前几天为zlib做了这个,我从www.zlib.net下载了源代码 ( 直接下载了zlib 1.2.3 ),打开了提供的visual studio项目文件,同时编译了这个lib的debug版和release版。 我没有尝试SQLite,但看到他们有源,这应该不难。
如果它是一个专有的DLL,你可以试着要求原始的开发者或公司的一个lib文件,或者写你自己的存根建议DLL或建议的动态路线,以RaphaelSP。
如果它们是用C语言导出的(没有C ++的名字),我会自己去动态路由。
我很快找到了这个例子: http : //www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/
这应该是一个免费的工具,使转换。 我不确定“限制试用版”是否“免费”,信息不是很清楚。 如果你已经测试过了,编辑你的问题,我会删除这个答案。
如果您联系Dll的开发者lib库工具,他们可能会愿意给你一个折扣。
之前我曾经遇到这种情况(我只需要一次昂贵的工具),有时候我已经成功地获得了很大的折扣。
它从来没有痛苦尝试。
祝你好运。
使用http://wyw.dcweb.cn/dllfaq.htm中的详细信息,我已经成功地从DLL获取DLL。 你的里程可能不一样。 我用这个来从python DLL中获得一个lib来构建一些用'C'写的python扩展。
开源的edll有自己的内部COFF加载器。 edll是为完全不同的目的而编写的,但由于它具有独立的COFF加载程序,也许可以将.dll合并到二进制流或资源中的.exe中,然后在运行时使用edll的COFF加载器来加载内置dll 。