2009-10-08 68 views
12

我知道有一个名为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文件,那么一切都很好。

+0

这是一个原生的C/C++ DLL或.NET吗? – 2009-10-08 09:17:06

+0

等一下...至少在zlib和sqlite3的情况下,获得原始导入库不是更容易吗? – 2009-10-09 14:21:02

+0

sqlite只是一个人人都听说过的例子。我知道原来的入口库存在这个,但我想传达的DLL(AddTwoNum.dll)没有。 – 2009-10-09 18:43:52

回答

0

This据说是一个免费的工具,使转换。我不确定它是否像“有限试用版”中的“免费”那样,信息不是很清楚。如果您已经测试过,请编辑您的问题,我将删除此答案。

+0

这是$ 999产品工具(现在在版本3.0,但谢谢你的好意 – 2009-10-08 19:28:15

+0

那么你对了,我给他提供了$ 100,他同意我更喜欢有自己的解决方案寿 – 2009-10-09 23:13:58

+0

@Mike操盘手 - 。不要你的意思我是对的要求折扣?:) – 2009-10-10 12:32:49

5

我假设你想在C/C++中调用dll中的某些函数/方法,而无需访问与它链接的lib文件。

如果你知道你需要的函数的签名,您可以:

  • 创建DLL
  • 创建一个DLL项目的自己的存根版本,具有相同的名称,只要你想的dll使用您要拨打
  • 功能
  • 添加存根实现的签名是非常重要的用于depends.exe或DUMPBIN.EXE以检查它们是否匹配。
  • 然后编写/构建你的程序链接到的存根DLL
  • 运行程序以实物
+0

你假设正确。我通常有.h头文件,所以我知道签名。你详细的步骤对我来说都是新的。如果你能详细说明它们或链接到演示,我将非常感激。 – 2009-10-08 19:37:06

+1

基本上,这归结于创建一个新的DLL项目,它将生成与缺少的相同的导入库。 – 2009-10-08 19:53:13

+0

对。它只是一个导航困难的水域到达那里的情况 – 2009-10-09 04:36:24

4

你也可以去动态的方式代替存根DLL,使用LoadLibrary()GetProcAddress()

(请参阅第二个链接的示例)。

+0

谢谢。是的,这总是一个好方法。这将起作用,但这个问题的目的是将该库包含在VS2008项目中,而不需要花费1000美元。 – 2009-10-08 22:33:17

0

如果您联系Dll to lib工具的开发人员,他们可能愿意给您打折。

我以前一直在这种情况下(我只需要一次昂贵的工具),有时候我已经成功获得了很大的折扣。

它从来没有痛苦尝试。

祝你好运。

+0

你是对的。我做到了。他接受了100美元的产品,但是在做了这么多工作之后,我会推出自己的产品。 – 2009-10-12 21:05:29

1

在zlib或sqlite等情况下,您可以直接下载源代码并编译自己的lib文件。实际上,我前几天为zlib做了这个工作,我从www.zlib.netdirect zlib 1.2.3 download)下载了源代码,打开了提供的visual studio项目文件,并编译了lib的调试和发布版本。我没有尝试sqlite,但看到他们有源,这应该不难。

如果它是一个专有的dll,你可以试着要求原始的开发者或公司提供一个lib文件,或者写一个你自己建立的stub dll,或者转到RaphaelSP的动态路由。

如果它们是用C语言导出的(不需要C++名称修饰),我会自己去动态路由。

+0

是的。我希望转换的Dll没有.def或.lib文件,只有头文件可用。 – 2009-10-08 23:12:07

6

我似乎无法对他的答案评论(我需要更多的声誉?),但你可以尝试使用我的.dll wrapper generator创建的.dll伊恩建议存根。

+0

您已收到邮件 – 2009-10-08 23:10:28

+0

感谢您使用此代码。我被困在终点线上。见上面 – 2009-10-09 04:35:28

+0

我发现:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/b307bf26-2441-438f-960d-6b54db83fd6d 您是否在使用.dll而不是.lib链接? – floodyberry 2009-10-09 13:35:22

0

我曾在获得使用http://wyw.dcweb.cn/dllfaq.htm细节从DLL一个lib成功。你的里程可能有所不同我用这个从python DLL中获得一个库来构建一些用'C'写成的python扩展。

0

开源edll有其自己的内部COFF装载机。 edll是相当不同的目的编写的,但由于它具有内独立COFF装载机,也许是可能将您的.dll成二进制数据流或资源的.exe文件里面,然后在运行时使用edll的COFF加载器加载内置的dll 。

相关问题