1

我有一个编译为 VB6 exe 的 VB6 项目。

它有一个简单的形式作为它的启动对象。

它通过 regasm 的 .NET dll 启动一个 .NET 模态表单,将回调 COM 接口 (IHandler) 的实现传递给它。

.NET 回调 VB6 中的 IHandler 实现。

VB6 尝试使用 vbModal 显示一种新形式。VB6 表单被阻止交互,因为模态 .NET 表单仍然可见。

有没有办法解决这个问题或建议的方法?

我尝试在新的(STA)(托管)线程上回调 VB6,但是当它尝试执行 MyCallbackForm.Show vbModal 时,我得到“无效的过程调用或参数。”......我认为这与事实有关我正在回电一个新线程...


更新:如果我将我的 VB6 项目类型设置为 ActiveX exe,我能够成功地在新线程上进行回调并以模态方式显示我的 VB6 表单......但是一旦我这样做了,我似乎失去了回调上的线程 - 制作从 VB6 到 .NET 的后续调用导致了跨线程异常。我猜这与使用 ActiveX exe 时的线程模型有关......

4

2 回答 2

0

您可以在 VB6 应用程序中无模式地显示带有 .NET 控件的表单,但是,您必须这样做:

  • 创建一个 .NET 用户控件,其中包含应在表单上的所有内容。
  • 使用MS InteropToolkit轻松创建COM可见的用户控件,并让该控件继承自用户控件(也可以跳过第一步,直接让用户控件com可见)
  • 在您的 VB6 项目中创建一个新窗体,并将 COMVisible .NET 用户控件添加到其中。
于 2012-07-04T08:02:10.503 回答
0

您可以将 VB6 EXE 项目拆分为两个项目。
项目一是当前的 VB6 项目减去您希望能够从 .Net DLL 显示的子窗体。项目二是一个 VB6 ActiveX DLL 项目,它应该包含您希望能够从您的 .Net dll 中显示的子表单。

所以,而不是这样做: 1. VB6.exe 项目调用传递 IHandler 的 .Net DLL 2. .Net 项目调用 IHandler 中的函数 3. IHandler(VB6 实现)试图显示一个子窗体,没有运气。

你这样做: 1. VB6.exe 项目调用 .Net DLL,从主项目中传递子窗体需要的任何数据 2. .Net 项目在包含子窗体的 ActiveX DLL 中调用“ShowYourSelf”函数并传递任何数据必要的。

于 2012-07-04T08:15:57.987 回答