C ++ out-proc COM服务器在VB.NET中重写并与C ++ EXE共享

时间:2014-03-27 18:36:00

标签: c++ vb.net com

我在VB.NET中重写了一个out-proc COM ErrorModule。该模块由我们的旧COM C ++程序使用。 VB.NET对COM类及其接口使用相同的GUI,与旧的C ++使用相同的DispId。我试图使这个C ++模块透明,所以我们不需要更改它们。它们只是使用从旧的ErrorModule.idl生成的旧ErrorModule.h进行编译,我打算保留它。它有效但是:

旧:

(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都会更新注册表吗?

1 个答案:

答案 0 :(得分:0)

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

该解决方案由Steven Doggart在之前的帖子中提供。我会像C ++那样保持out-proc服务器,但它将是一个空壳,是VB.NET COM的代理,它实现了相同的功能,但是在VB.NET而不是C ++中。

很抱歉这些长篇邮件。