我知道有一个名为Dll的工具,但开发人员要求$ 1000。 我只需要一次转换一个库,所以不容易证明这个价格。将Windows Dll转换为C++ Visual Studio 2008的.lib
我试过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 这又使得创建一个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的说法/出口C:\路径\到\ AddShow.dll 确实是绝对没有 一些研究
后http://msdn.microsoft.com/en-us/library/aa446532.aspx 似乎mspdb71.dll(现mspdb80.dll)从现在通用/ IDE文件夹 DUMPBIN.EXE需要运行出现错误:
致命错误LNK1106:无效的文件或磁盘已满:无法寻求0x6179A 这些线程表明DUMPBIN.EXE的版本可能是问题
我有Microsoft(R)COFF/PE自卸车版本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-error-lnk1106-invalid-file-disk-full.html
当我运行procmon中我看到QueryOpen和sqlite3.dll中第一次出现时的svchost.exe试图打开它,失败与错误路径未找到。路径是C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin \ SQLITE3.DLL并且正确。如果我把它放在C盘的根目录,然后我得到找不到名称错误:
C:\ Program Files文件\微软的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:
我试图运行DUMPBIN.EXE从它的安装位置\ Program Files \ Microsoft Visual Studio 8 \ VC \ bin中,但操作系统表示找不到mspdb80.dll。我从\ Program Files \ Microsoft Visual Studio 8 \ Common7 \ IDE复制了mspdb80.dll,试图让dumpbin.exe运行。
现在我得到的错误: “c1902程序数据库管理器不匹配,请检查您的安装”
如果我从\ Program Files文件\微软的Visual Studio mspdb80.dll除去8 \ VC \ bin中的错误消失!但我无法运行dumpbin.exe。
新增4:
我终于能够得到DUMPBIN由以下文件复制到一个文件夹运行:
DUMPBIN.EXE LINK.EXE LIB.EXE mspdb80.dll
我没有得到错误:
致命错误LNK1248:图像尺寸(FFFFFXXX)超过最大允许大小 (8000)
曾经,但更换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项目并编译并运行。调试器则报告错误: 运行时检查失败#0 - ESP的值未正确保存跨函数调用...
如此地 "Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call" after successful C# callback from the C++ code of GameSpy lib 这是因为我在DLL中使用STDCALL并在我的应用程序中声明了__cdecl。
extern "C" { // put Dll C function prototypes here
int __cdecl AddTwoNum(int n, double f); // __stdcall
}
因此改变这__stdcall应该修复它,你会觉得..但可惜没有。
现在我得到一个链接错误: 错误LNK2001:解析外部符号_AddTwoNum @ 12
这是出于某种原因装饰函数名。为什么?
中加入N:
嗯,这竟然是因为的.lib文件是使用一个dll进行,但与STDCALL功能。 STDCALL需要调用者清理堆栈,以便使用@符号将参数的字节数附加到函数名称。在这种情况下,我有三个4Byte iintegers总共12个字节。
一旦我从用CDECL调用约定创建的dll重新创建.lib文件,那么一切都很好。
这是一个原生的C/C++ DLL或.NET吗? – 2009-10-08 09:17:06
等一下...至少在zlib和sqlite3的情况下,获得原始导入库不是更容易吗? – 2009-10-09 14:21:02
sqlite只是一个人人都听说过的例子。我知道原来的入口库存在这个,但我想传达的DLL(AddTwoNum.dll)没有。 – 2009-10-09 18:43:52