【问题标题】:C++ out-proc COM server rewritten in VB.NET and shared accross C++ EXE用 VB.NET 重写的 C++ out-proc COM 服务器并跨 C++ EXE 共享
【发布时间】:2014-05-06 22:33:50
【问题描述】:

我在 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 中工作吗?主程序能否使用LogicalModule的ErrorModule中的IError COM接口?

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

我意识到如果我重建 C++ 模块,那么它会再次开始工作吗?我在 ErrorModule.dll 的 cmets 中放了一行代码,重建,然后它停止处理 ESP 错误?两者之间没有直接联系吗?据我所知,重建 VB.NET 所做的所有工作都是更新注册表?

【问题讨论】:

  • 相当模糊。当您添加或删除方法参数时,您会在 C++ 程序中遇到该错误。这完全是非法的,你不能改变 IError。
  • 我没有更改 IError。一个模块创建了它的一个实例:pitfError。将其作为 byref 参数返回:另一个模块的 **pitfError。其他模块尝试使用它,然后 ESP 异常。

标签: c++ vb.net com


【解决方案1】:

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

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

对不起,冗长的消息。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2011-12-30
    • 2014-05-05
    • 1970-01-01
    • 2019-02-13
    • 2011-08-14
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多