1. 程式人生 > >64位程序呼叫32位dll的解決方法

64位程序呼叫32位dll的解決方法

在Windows7 X64,VS2008環境下做32位程式編譯為64位程式的工作,遇到了一些64位程式設計中可能遇到的問題:如內聯彙編(解決方法改為C/C++程式碼),long型別的變化,最關鍵的遇到了64位進程需要呼叫32位dll的問題。由於有一些32位dll沒有原始碼,無法重新編譯為64位dll,所以只能想辦法解決64位程序呼叫32位dll問題。

相關資料:
微軟公司的官方網站針對這個問題描述如下:
在64位的windows系統中,一個64位程序不能載入一個32位dll,同理一個32位程序也不能載入一個64位dll。但是,64位windows支援64位和32位程序(包括本機或跨機)間程序間通訊(RPC)。在64位windows中,一個程序外32位COM伺服器能
夠與64位客戶端進行通訊,同樣一個程序外64位COM伺服器也能與32位客戶端進行通訊。因此,如果你有一個32位COM無法識別的DLL,你可以將它封裝到一個程序外COM伺服器中並在一個64位程序中用COM配置呼叫DLL。

驗證:
工作流程:
1.建立一個程序外COM伺服器(EXE)。
2.將32位dll的介面函式封裝為COM伺服器的相關介面。
3.註冊COM伺服器*.exe /regserver  (登出 *.exe /unregserver)。
4.64位程序呼叫32位COM伺服器介面,成功。從而曲線實現了64位程序呼叫32位dll。

具體步驟:
我首先建立了一個簡單的dll工程,只輸出一個函式int c = add(int a,int
 b); 生成lib和dll
然後建立一個程序外COM(EXE型別),內部連結dll,新增方法Method: Add(long *c)
{ *c = add(1,2);}編譯生成。
然後註冊COM,*.exe /regserver
最建立一個64位WIN32工程驗證64位環境下方法呼叫是否正確,經驗證正確!!!

結論:以上方法可以解決64位程序呼叫32位dll的問題

32位程序呼叫64位dll應該也可以通過這種方法解決,原因64位windows系統下安裝了32位和64位兩套COM系統。