用VB重写的c++ out-proc COM服务器.. NET和跨c++ EXE共享

C++ out-proc COM server rewritten in VB.NET and shared accross C++ EXE

本文关键字:c++ NET 和跨 EXE 共享 服务器 out-proc VB 重写 COM      更新时间:2023-10-16

我在VB.NET中重写了一个输出过程COM ErrorModule。该模块是我们老的COM c++程序所使用的。VB。. NET对COM类及其接口使用相同的GUI,并使用与旧c++相同的DispId。我试图使这个透明的c++模块,所以我们不需要改变他们。它们只是使用从旧ErrorModule生成的旧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中工作。净吗?MainProgram可以使用LogicalModule的ErrorModule中的IError COM接口吗?

我正在测试两个c++之间IError的编组。它工作,但我有以下问题。每次我在VB中更改ErrorModule.dll。. NET,重新构建,然后编组停止工作,我得到和错误"ESP的值没有正确保存…"。

我意识到如果我重建c++模块,那么它又开始工作了吗?我在ErrorModule.dll的注释中放入一行代码,重新构建,然后它停止与ESP错误一起工作?两者之间没有直接联系吗?全部重建VB。就我所知,。NET会更新注册表吗?

我仔细考虑了一下我想做的事情,现在我觉得这很疯狂。由。net接口创建的一个COM接口,返回给一个c++ EXE,后者又把它传递给另一个试图调用它的方法的c++ EXE。调用进程的堆栈上的变量被另一个进程使用?我不是栈专家,但我开始觉得这完全是疯狂的。

Steven Doggart在之前的一篇文章中提供了解决方案。我将在c++中保持进程外服务器的方式,但它将是一个空shell,一个VB的代理。实现相同的功能,但在VB。. NET而不是c++。