我在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都会更新注册表吗?
答案 0 :(得分:0)
想想我现在要做什么,我认为它非常疯狂。由.NET接口创建的COM接口返回到C ++ EXE,后者又将其传递给另一个尝试调用其方法的C ++ EXE。使用调用进程堆栈上的变量,由另一个进程使用?我不是专家,但我开始认为这完全是疯了。
该解决方案由Steven Doggart在之前的帖子中提供。我会像C ++那样保持out-proc服务器,但它将是一个空壳,是VB.NET COM的代理,它实现了相同的功能,但是在VB.NET而不是C ++中。
很抱歉这些长篇邮件。