2014-03-27 56 views
1

我已經在VB.NET中重新編寫了一個out-proc COM ErrorModule。該模塊由我們的舊COM C++程序使用。 VB.NET對COM類及其接口使用相同的GUI,與舊的C++使用相同的DispId。我試圖使C++模塊透明,所以我們不需要改變它們。它們只是使用舊的ErrorModule.idl生成的舊ErrorModule.h進行編譯,我打算保留它。它的工作原理,但:在VB.NET中重寫的C++ out-proc COM服務器和跨C++ EXE共享

老:

(C++ COM client) MainProgram.exe 
(C++ COM server) LogicalModule.exe 
(C++ COM server) ErrorModule.exe, implements IError 

現在是:

(C++ COM client) MainProgram.exe 
(C++ COM server) LogicalModule.exe 
(VB.NET COM assembly) ErrorModule.dll, re-implements IError 

MainProgram.exe 
    ErrorModule.dll 

LogicalModule.exe 
    ErrorModule.dll 

通常MainProgram(主程序)調用LogicalModule。如果LogicalModule檢測到錯誤,則會創建一個COM類ErrorModule,並將其接口IError返回給MainProgram,最終將調用IError.showErrorDlg()。

這可以在VB.NET中工作嗎? MainProgram可以使用來自LogicalModule的ErrorModule的IError COM接口嗎?我正在測試兩個C++之間IError的編組。它的工作原理,但我有以下問題。每次我在VB.NET中對ErrorModule.dll進行更改時,重新編譯,然後編組停止工作,並且出現錯誤「ESP的值未正確保存......」。

我意識到如果我重建C++模塊,然後它再次工作?我在ErrorModule.dll的註釋中放入一行代碼,重建,然後停止使用ESP錯誤?兩者之間沒有直接聯繫?據我所知,所有重建VB.NET所做的都是更新註冊表。

+0

很含糊。當您添加或刪除方法參數時,您會在C++程序中發生該錯誤。這完全是非法的,你不能改變IError。 –

+0

我不改變IError。一個模塊創建它的一個實例:pitfError。將它作爲一個byref參數返回:**另一個模塊的pitfError。其他模塊嘗試使用它,然後ESP異常。 –

回答

0

一想到我現在想做什麼,我覺得它很瘋狂。一個由.NET接口創建的COM接口返回到一個C++ EXE,後者又將它傳遞給另一個試圖調用其方法的C++ EXE。使用另一個進程使用的調用進程堆棧上的變量?我不是專家,但我開始認爲這是完全瘋狂的。

該解決方案由Steven Doggart在前一篇文章中提供。我將以C++的方式保留out-proc服務器,但它將是一個空殼,是VB.NET COM的代理,實現了相同的功能,但在VB.NET而不是C++中。

對不起,長的消息。