2016-10-09 252 views
0

我需要遷移32位DLL才能在64位C#(以及C++)應用程序中使用它。該DLL是在非託管的delphi代碼中寫入的。我不能重新編譯dll,唯一的辦法就是使用進程間通信(IPC)。我搜索了很長時間,但是我沒有找到有關的信息。我發現的最好的指南是在這個鏈接:Accessing 32-bit DLLs from 64-bit code從64位代碼訪問32位DLL

我遵循這個指南來達到我的目標,因爲這個論壇經常被引用。所以本指南解釋我必須做三個步驟:

1°STEP - 創建一個32位組件,實現一個COM對象,該對象加載並調用到32位DLL中,並將32位DLL接口公開爲COM接口。所以我做了同樣的事情,解釋here(從以前的鏈接採取爲例):

[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IGetMyString 
{ 
    string GetMyString(); 
} 

[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")] 
[ProgId("CallPDW.Class1")] 
[ClassInterface(ClassInterfaceType.None)] 
public class Class1 : IGetMyString 
{ 
    string GetMyString() 
    { 
     ...... 
    } 
} 

那我也註冊.NET COM組件,所以我必須使用Regasm.exe,而是我創建Visual Studio安裝程序和部署項目,這些項目構建了一個MSI文件並使Regasm可以做到同樣的事情。然後我控制註冊表編輯器,我找到了HKEYs,所以它的工作原理。 因此,直到這一步一切正常或似乎沒問題。

2°STEP - 通過創建一個標準COM + OOP應用程序(使用的dllhost作爲代理進程)配置外的過程(OOP)這種COM組件;

3°STEP - 創建一個64位包裝器DLL,它實現與原始32位DLL相同的接口,導入上面創建的COM對象的COM接口, 將當前調用轉換爲公開的接口調用到COM對象接口,傳送呼叫參數,接收返回值並將它們委託給呼叫者;

的問題是,在2°和3°的步驟我不知道如何實現,因爲我沒有發現任何東西在網絡上或在這個論壇。所以我需要幫助來實現步驟2°和3°。也可以鏈接到其他職位等 在此先感謝。


其它信息(2016年12月10日 - 下午11點10): 1.)與函數指針一個C/C++頭(: 此DLL通過兩個接口暴露其功能,以32位的天然環境中WINAPI *) 2)與對一個.NET接口/ Invoke的

回答

1

你在正確的軌道上。您已經創建並註冊了一個COM可見封裝器DLL,這是公開Delphi庫的方法所必需的。

由於您的64位程序不能調用此86封裝,有一個代理進程的需要。但是,如果你不打算使用它的任何服務,將你的DLL轉換成一個完整的COM+服務器是沒有意義的。

相反,我建議您將包裝器DLL託管到默認的COM代理項目中。爲此,請調用基於x86的OLE/COM Object Viewer,它是Windows SDK的一部分。展開「所有對象」節點並選擇您的COM可見類。從那裏,切換到「實施」選項卡並選中「使用代理過程」。切換到「註冊表」選項卡並確認「AppID」節點現在包含[DllSurrogate]條目。注意:如果您需要自動執行此步驟,則需要手動或通過安裝程序自行將相應的值寫入註冊表。

您現在應該能夠從x64主機創建COM可見包裝類的實例。

+0

HI @Aurora。非常感謝您回答。確定它工作到「... ains [DllSurrogate]條目。」 – bob

+0

現在我想自動執行此操作。你有一些建議嗎?另外,我還想爲COM可見包裝器類創建一個包裝器DLL,以便直接使用另一個DLL來調用我的x64主機中的函數。 – bob

+0

您是否以完全管理權限(以管理員身份運行)運行'oleview'?您需要各自的權限才能寫入註冊表。如果您想手動編寫'DllSurrogate'條目,請查看[this](https://msdn.microsoft.com/en-us/library/windows/desktop/ms691260(v = vs.85).aspx )鏈接。關於你的第二個DLL:你可以通過你的COM可見封裝來公開'P/Invoke'函數。只需在接口和類中添加一個新的方法,即調用相應的函數。 – Aurora