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

flseospp  于 2023-01-10  发布在  Windows
关注(0)|答案(9)|浏览(125)

我知道有一个叫做Dll to lib的工具,但是开发人员要价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时,我得到了链接器错误:添加显示. 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文件夹中的mspdb71.dll(现在为mspdb80.dll)dumpbin.exe现在运行时出现错误:
致命错误LNK1106:无效文件或磁盘已满:无法查找到0x6179A这些线程表明dumpbin.exe的版本可能有问题
我有Microsoft(R)COFF/PE转储程序版本9.00.30729.01
因此,我尝试了Microsoft(R)COFF二进制文件转储程序版本5. 12. 8078,但没有成功。经过大量阅读,我没有更接近
http://support.microsoft.com/kb/815645 x http://support.microsoft.com/kb/839286http://markmail.org/message/p5vwzyfyv3bs6z34http://fixunix.com/programmer/94825-fatal-error-lnk1106-invalid-file-disk-full.html
当我运行ProcMon时,当svchost.exe尝试打开它但失败并显示错误PATH NOT FOUND时,我看到第一次出现queryopen和sqlite3.dll。路径为C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL,并且是正确的。如果我将其放在C驱动器的根目录下,则会出现NAME NOT FOUND错误:
C:\程序文件\Microsoft Visual Studio 9.0\VC\二进制文件\链接. exe。本地
C:\程序文件\Microsoft Visual Studio 9.0\VC\二进制文件\转储二进制文件.本地
分别来自link.exe和dumpbin.exe。我使用的是XPSP3而不是Vista,这是我对sysinternals知识的限制。这些是什么。本地文件?
(csrss.exe也无法找到一些清单文件。)
所以还没成功只是更神秘
增加3:
我尝试从dumpbin.exe的安装位置\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运行复制以下文件到一个文件夹:
转储文件. exe链接. exe库. 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项目中并进行编译和运行。调试器随后报告了一个错误:运行时检查故障#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文件是使用一个带有STDCALL函数的dll创建的。STDCALL要求调用者清理堆栈,这样参数的字节数就用@符号附加到函数名上。在这个例子中,我有三个4字节整数,总共12个字节。
一旦我从用CDECL调用约定创建的dll重新生成了. lib文件,那么一切都很好。

qlfbtfca

qlfbtfca1#

您可以尝试使用我的.dll wrapper generator创建iain建议的stub .dll。
我还发现:this线程。您是否链接到.dll而不是.lib?

sy5wg1nm

sy5wg1nm2#

我假设您想在C/C++中调用dll中的一些函数/方法,而不需要访问lib文件来与之链接。
如果您知道所需函数的签名,则可以:

  • 创建你自己的dll存根版本
  • 创建一个dll项目,与你要使用的dll同名
  • 添加要调用的函数的存根实现
  • 签名非常重要,请使用depends.exe或dumpbin.exe检查它们是否匹配。
  • 然后编写/生成链接到存根dll的程序
  • 要运行该程序,请用真实的的dll替换存根dll
w41d8nur

w41d8nur3#

您还可以使用LoadLibrary()GetProcAddress()来实现动态方式。
(See例如第二链接)。

6rvt4ljy

6rvt4ljy4#

对于zlib或sqlite,您可以直接下载源代码并编译您自己的lib文件,事实上,我前几天刚刚为zlib做了此操作,我从www.zlib.net下载了源代码(direct zlib 1.2.3 download)打开了提供的visual studio项目文件,并编译了lib的调试和发布版本。我没有尝试过sqlite,但看到他们有源代码,这应该不难做到。
如果它是一个专有的dll,你可以试着向最初的开发者或公司要一个lib文件,或者按照iain的建议写你自己的stub dll,或者走RaphaelSP的动态路线。
如果它们是用C导出的(没有C++名称损坏),我会自己走动态路线。

6vl6ewon

6vl6ewon6#

This应该是一个免费的转换工具。我不确定它是否是“免费”的“有限试用版”,信息不是很清楚。如果你已经测试过了,编辑你的问题,我会删除这个答案。

qmelpv7a

qmelpv7a7#

如果您联系Dll to lib工具的开发人员,他们可能愿意给予您折扣。
我以前遇到过这种情况(我只需要一个昂贵的工具一次),有时我已经成功地获得了很大的折扣。
试试总没坏处。
祝你好运。

vyswwuz2

vyswwuz28#

我已经成功地使用http://wyw.dcweb.cn/dllfaq.htm中的细节从DLL中获取了一个库。您的里程可能会有所不同。我已经使用这个从python DLL中获取了一个库来构建一些用“C”编写的python扩展。

qzlgjiam

qzlgjiam9#

开源的edll有它自己的内部COFF加载器。edll是为完全不同的目的而写的,但是由于它有独立的COFF加载器,也许可以将你的.dll合并到你的.exe中的二进制流或资源中,然后在运行时使用edll的COFF加载器来加载内置的dll。

相关问题