我知道有一个名为 Dll 的工具,但开发人员要价 1000 美元。我只需要转换一个库,一次,所以很难证明这个价格是合理的。
我试过 IMPLIB32.EXE,但我只是得到空的 .lib 文件。我怎样才能做到这一点?也许我可以编写一个简单的转换应用程序?
补充1:
Dll 通常是 stdcall 而不是 cdecl,并且是用较旧的 C 语言编写的,例如语言不是 C#、.NET 或 C++。我现在需要从 C++ 应用程序中调用它们。SQLite.dll 或 zlib.dll 就是一个例子。我无权访问这些 dll 的 .lib 文件。
补充2:
我为 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/
运行带有参数 /exports C:\path\to\AddShow.dll 的 dumpbin 完全没有经过一些研究
http://msdn.microsoft.com/en-us/library/aa446532.aspx 似乎需要从 common/ide 文件夹 dumpbin.exe 中的 mspdb71.dll(现在是 mspdb80.dll)现在运行时出现错误:
致命错误 LNK1106:无效文件或磁盘已满:无法查找 0x6179A 这些线程表明可能是 dumpbin.exe 的版本问题
我有 Microsoft (R) COFF/PE Dumper 版本 9.00.30729.01
所以我尝试了 Microsoft (R) COFF Binary File Dumper Version 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 尝试打开它并失败并出现错误 PATH NOT FOUND。路径是 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://support .microsoft.com/kb/131313 并得到错误:警告 lnk4017 statement not supported for the target platform ignored 这原来是因为我指定了 .dll 而不是 .def 文件。
然后将生成的 .Lib 和 .exp 文件添加到 VS2008 项目中并编译和运行。调试器随后报告错误:运行时检查失败 #0 - ESP 的值未在函数调用中正确保存...
如此处所述 “运行时检查失败 #0 - ESP 的值未在函数调用中正确保存”在从 GameSpy 库的 C++ 代码成功回调后, 这是因为我在我的 dll 中使用了 stdcall 并在我的应用程序。
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 整数,总共 12 个字节。
一旦我从使用 CDECL 调用约定创建的 dll 重新制作了 .lib 文件,那么一切都很好。