【问题标题】:Is there a way to pass an OCX control reference out from a Visual Basic 6 activeX dll via COM interop?有没有办法通过 COM 互操作从 Visual Basic 6 activeX dll 传递 OCX 控件引用?
【发布时间】:2011-03-02 21:51:40
【问题描述】:

我在尝试从旧的(但仍保持维护)VB6exe project(*) 源构建ActiveX dll 时偶然发现了这一点,以便通过COM / NET 互操作执行一些测试。

(期望的)用例是:

  1. 使用带有公共方法的 VB6 类获取或返回一些控制(例如 CommonDialog)参考
  2. 将此类编译为 ActiveX dll
  3. 通过 COM 互操作从 .NET 创建此类的实例并正确调用其方法

简而言之,第一个问题是有类似的东西

Public Function bad_dlg() As CommonDialog
   Set bad_dlg = Nothing
End Function

在 Visual Basic 6 ActiveX dll 的类文件中,编译 (* *) 失败并出现以下错误:

“私有对象模块不能在公共对象模块中用作公共过程的参数或返回类型、公共数据成员或公共用户定义类型的字段”

因此,问题是:

  1. 真的不能像上面那样编译运行正常吗?
  2. [IF NOT] 假设,我将所有内容更改为返回和接收 VB6 Object 类型的实例 -- 我如何从 .Net 使用这样的实例(调用特定方法等)

(*) -- 不是ActiveX exe,只是一个“普通”的

(* *) 前提是引用了适当的.ocx ("Microsoft Common Dialog Control 6.0 (SP6)", C:\Windows\system32\ComDlg32.OCX)

(* * *) 我找到的唯一一个是Passing control Ref to dll

【问题讨论】:

  • 不是完全相同的副本,因为 C# 是客户端,但您可能对 this question 也感兴趣,它还涉及通过 COM 互操作传递 VB6 控件引用。
  • @MarkJ(谢谢,现在已经很清楚了)VB6 专家经常“巡逻”,所以当被一些晦涩的话题困扰时,再好不过了!

标签: vb6 com-interop ocx


【解决方案1】:

(至于第一部分的问题)

Microsoft 文档 (Data Types Allowed in Properties and Methods ) 指出:

论归还私人物品的弊端

不允许使用以下数据类型,并且对它们的引用永远不应返回给客户端应用程序:

  • Visual Basic (VB) 对象库中提供的所有对象,例如控件。使用对象浏览器查看整个列表。

  • 所有形式。

  • Instancing 属性设置为 Private 的所有类模块。

  • 对 ActiveX 控件的引用。

Visual Basic 阻止您将非可视私有对象传入进程外组件或从进程外组件传出。尝试这样做会导致错误 98,“属性或方法调用不能包含对私有对象的引用,无论是作为参数还是作为返回值。” 客户端始终会收到此错误。

...

重要

  • 私有对象是私有的是有原因的,通常是因为它们不是为在您的项目之外使用而设计的。将它们传递给客户端可能会降低程序稳定性并导致与未来版本的 Visual Basic 不兼容。如果您需要将自己的私有类传递给客户端,请将 Instancing 属性设置为 Private 以外的值。

[详情如下]

【讨论】:

  • +1!我认为这段摘录很好“私有对象之所以私有是有原因的,通常是因为它们不是为在您的项目之外使用而设计的。将它们传递给客户端可能会降低程序稳定性......”
  • @MarkJ 同意,我已附加该帖子。有趣的是,您可以在 VS6 的 .chm 帮助中搜索“属性或方法调用不能包含对私有对象的引用,无论是作为参数还是作为返回值”[包括引号] 并获取(仅) 正确的链接:)
【解决方案2】:

无法帮助您使用 1,但在 DotNet 4.0 中使用 dynamic 关键字应该可以使用 2。

【讨论】:

  • 它在我的名单上,谢谢(虽然我真的很喜欢 2008 年的快递)
  • 2010 年的快递更胜一筹。现在每次要回到VS 2008,我都觉得有点脏。
  • 可能“新 6”真的那么好,但是字体混叠让我望而却步 :)
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多