2008-12-04 184 views
13

我有一個類似於Taskbar Shuffle的Delphi應用程序,它包含一個hook dll。是否可以從32位應用程序訪問64位dll?

編輯:此掛鉤DLL通過發送Windows消息與主應用程序進行通信。

我想添加對XP和Vista x64的支持,我最初的想法是將dll轉換爲64位(使用FreePascal進行編譯),但現在將應用程序保留爲32位(Delphi)。

是否有可能爲一個32位的應用程序來訪問一個64位的dll?

EDIT2:我正在通過LoadLibrary加載DLL,所以我想我被卡住了,因爲32位進程將無法加載64位DLL,根據我在鏈接上讀取的內容Lars Truijens指出下面的答案之一。

回答

6

號你必須編譯兩個版本:64位和32位。

+0

即使hook dll的唯一任務是與主應用程序通信以發送windows消息嗎? – smartins 2008-12-04 08:33:59

+0

不,32位dll會以64位進程加載或以其他方式加載。如果情況並非如此,那麼就沒有問題了。 – 2008-12-04 09:56:35

+0

錯誤的答案。如果您創建背景64位進程,現在可以實現這一點。 :) – 2011-05-27 06:33:35

2

沒有,但你也許可以得到解決,使用COM。如果在作爲獨立進程運行的COM對象中運行dll,並與可編組接口(例如:自動化兼容接口)通信,它應該可以工作。這並不總是可行的,取決於dll的作用以及集成和調用表面的廣泛程度,但它是應該能夠使這種情況成爲可能的選項。

9

只要在64位DLL被通過一個單獨的64位過程中加載,和32位的處理和64位DLL之間的所有通信經由鬆散耦合IPC狀機構,該OS可以馬歇爾,那麼你可以做到這一點。

我做了類似的事情。一個32位應用程序需要在DLL中實現的自定義打印後臺處理程序加載項。應用程序和後臺打印程序加載項通過IPC機制進行通信(在這種情況下,這是一種說臨時文件的奇特方式)。

在64位系統上,除了打印後臺處理程序拒絕加載加載項DLL,因爲打印後臺處理程序當然是64位進程,所有有關32位應用程序的工作都可以正常工作。

將該溶液作爲重建只後臺處理程序加載在64位一樣簡單。無需更改整個32位應用程序。

6

我只是發現了這個解決方案,從CodeCentral: http://cc.embarcadero.com/Author/802978

它允許調用從32位代碼中的任何64位庫。

這是一個複雜的解決方案,在後臺運行一個由asm編寫的64位可執行文件,然後使用內存映射文件和windows GDI消息與其進行通信,以從32位Delphi進程啓動一些64位函數。

有一個樣品,其能夠裝載任何64位庫,然後調用該庫中的任何功能中,從32位的可執行文件。

似乎很好。在所有情況下,代碼都值得一看:它是技術性的,但設計良好!

相關問題