Vb6 有没有办法通过COM互操作从Visual Basic 6 activeX dll传递OCX控件引用?

Vb6 有没有办法通过COM互操作从Visual Basic 6 activeX dll传递OCX控件引用?,vb6,com-interop,ocx,Vb6,Com Interop,Ocx,我在尝试从一个旧的(但仍然保持的)VB6exe项目(*)源代码构建ActiveX dll时偶然发现了这一点,以便通过COM/NET互操作执行一些测试 (期望的)用例是: 以带有公共方法的VB6类为例,获取或返回一些控件(例如CommonDialog)引用 将此类编译为ActiveX dll 通过.NET中的COM互操作创建此类的实例,并正确调用其方法 简言之,第一个问题是 Public Function bad_dlg() As CommonDialog Set bad_dlg = N

我在尝试从一个旧的(但仍然保持的)VB6
exe项目
(*)源代码构建
ActiveX dll
时偶然发现了这一点,以便通过
COM/NET
互操作执行一些测试

(期望的)用例是:

  • 以带有公共方法的
    VB6
    类为例,获取或返回一些控件(例如
    CommonDialog
    )引用
  • 将此类编译为ActiveX dll
  • 通过.NET中的COM互操作创建此类的实例,并正确调用其方法
  • 简言之,第一个问题是

    Public Function bad_dlg() As CommonDialog
       Set bad_dlg = Nothing
    End Function
    
    在Visual Basic 6
    ActiveX dll
    中,类文件使编译(**)失败,并出现以下错误:

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

    因此,问题是:

  • 是否真的不可能正确编译和运行上述内容
  • [如果不是]假设,我将所有内容都更改为返回和接收
    VB6
    对象
    类型的实例——如何从.Net处理这样的实例(调用特定方法等)
  • (*)--不是一个
    ActiveX exe
    ,只是一个“普通”的

    (**)如果引用了适当的
    .ocx
    (“Microsoft通用对话框控件6.0(SP6)”,则C:\Windows\system32\ComDlg32.ocx)


    (***)我发现的唯一一个问题是,

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

    (关于问题的第一部分)

    Microsoft文档()说明:

    论归还私人物品的罪恶 不允许使用以下数据类型,对它们的引用不应返回到客户端应用程序:

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

    • 所有形式

    • 实例属性设置为私有的所有类模块

    • 对ActiveX控件的引用

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

    重要的

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


    它在我的名单上,谢谢(虽然我真的很喜欢2008年的快车),2010年的快车更好。每次回到VS 2008,我都觉得有点脏。可能“新6”真的很好,但字体别名的问题让我无法使用:)不是完全重复的,因为C是客户端,但您可能还对在COM互操作中传递VB6控件引用感兴趣。@MarkJ(谢谢,现在已经清楚了)由于VB6大师定期“巡逻”,因此当遇到一些晦涩难懂的话题时,这不是一个更好的去处+1.我认为这段摘录很好,“私有对象是私有的,这是有原因的,通常是因为它们不是为在项目之外使用而设计的。将它们传递给客户端可能会降低程序的稳定性……”MarkJ同意,我在文章后面加了一句。有趣的是,可以在VS6的.chm帮助中搜索“属性或方法调用不能包含对私有对象的引用,无论是作为参数还是作为返回值”[包括引号]并获得(唯一)正确的链接:)