【发布时间】: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 异常。