在VB.NET中重写的C++ out-proc COM服务器和跨C++ EXE共享

问题描述:

我已经在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异常。 –

一想到我现在想做什么,我觉得它很疯狂。一个由.NET接口创建的COM接口返回到一个C++ EXE,后者又将它传递给另一个试图调用其方法的C++ EXE。使用另一个进程使用的调用进程堆栈上的变量?我不是专家,但我开始认为这是完全疯狂的。

该解决方案由Steven Doggart在前一篇文章中提供。我将以C++的方式保留out-proc服务器,但它将是一个空壳,是VB.NET COM的代理,实现了相同的功能,但在VB.NET而不是C++中。

对不起,长的消息。