2013-05-11 316 views
0

我想從32位應用程序訪問64位DLL。由於第三方鎖定,我們沒有合適的32位應用程序端口。創建2個不同版本的64位dll實際上是不可行的,因爲要滿足依賴關係,我們可能必須以兩種方式構建幾乎整個應用程序,從而使整個移植目的無效。 爲了進一步放大,我們希望從32位應用程序訪問64位ODBC。從32位訪問64位ODBC過程

我在兩個propritory的解決方案來在這方面

ODBC-ODBC Bridge - Easysoft

Openlink Software

兩者都是和解的解決方案,但在找一些開源或在內部推行

一個小小的研究在這方面,我相信如果我們可以將DLL作爲一個單獨的進程加載並使用IPC進行通信,如Interprocess Communication Between 32-bit and 64-bit Applications。這裏面臨的挑戰是在數據涉及參考數據類型時對數據進行編組和解組。

在這方面,我遇到了一個SO回答Is it possible to access a 64-bit dll from a 32-bit application?鏈接到Code Central解決方案。這是一個delphi解決方案,我想仔細閱讀Visual C++的類似解決方案。

是否有任何試圖解決該問題的開源實現?

回答

0

您無法從32位應用程序或64位應用程序的32位DLL訪問64位DLL。這是因爲處理器無法切換​​這種模式 - 當64位操作系統運行32位應用程序時,處理器處於「兼容模式」,您必須更改模式才能進入DLL。儘管在技術上可以實現模式切換,但還存在許多其他問題 - 例如「32位應用程序在單個寄存器中接收到64位值時發生了什麼」。

Delphi模型中的解決方案是啓動另一個64位應用程序,它只是一個很細的DLL,本身並沒有下載源代碼來看它,但它從描述聽起來像是一個IPC在64位進程中調用一個函數,並通過IPC將結果返回到32位進程。對於任何語言來說,這當然是合理的解決方案。然而,它涉及到一個額外的IPC階段(當然這確實涉及編組問題 - 儘管數據庫傾向於將結果作爲文本提供,因此您可能在這方面相當出色),這在數據庫中可能代價高昂應用程序由於數據的雙重複制。

我完全不相信將應用程序編譯爲64位應用程序是不值得的 - 如果應用程序編寫得很好,它不會比轉換切換更多。由於提供了額外的寄存器,64位應用程序的運行速度往往比32位相同的應用程序快一點。

很抱歉,如果這不是您要查找的「這是一個鏈接...」的答案。

+0

我終於選擇使用'COM RPC'在32位應用程序和64位進程之間進行通信。請注意,由於存在第三方DLL的依賴關係,因此無法將應用程序移植到64位。謝謝您的回答。 – Abhijit 2013-09-12 17:37:14