2009-10-08 66 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 。

相關問題