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

时间:2011-03-01 13:08:47

标签: vb6 com-interop ocx

我在尝试从旧的(但仍然维护的)ActiveX dll VB6(*)来源构建exe project时偶然发现了这一点,以便通过{{1}执行某些测试互操作。

(期望的)用例是:

  1. 使用带有或返回某些控件的公共方法COM / NET类(例如VB6)参考
  2. 将此类编译为ActiveX dll
  3. 通过.NET中的COM interop创建此类的实例,并正确调用其方法
  4. 简而言之,第一个问题是拥有像

    这样的东西
    CommonDialog
    Visual Basic 6 Public Function bad_dlg() As CommonDialog Set bad_dlg = Nothing End Function 的类文件中的

    使编译(* *)失败,并出现以下错误:

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

    因此,问题是:

    1. 上面的内容是否真的不可能编译并正常运行?
    2. [IF NOT]假设,我更改了所有内容以返回并接收ActiveX dll VB6类型的实例 - 如何使用.Net中的此类实例(调用特定方法等)< / LI>

      (*) - 不是Object,只是“普通”

      (* *),前提是适当的ActiveX exe(“Microsoft Common Dialog Control 6.0(SP6)”,C:\ Windows \ system32 \ ComDlg32.OCX)

      (* * *)我发现的唯一一个是Passing control Ref to dll

2 个答案:

答案 0 :(得分:2)

(至于问题的第1部分)

Microsoft文档(Data Types Allowed in Properties and Methods )声明:

  

关于归还私人物品的罪恶

     

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

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

  •   
  • 所有表格。

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

  •   
  • 对ActiveX控件的引用。

  •   
     

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

     

...

     

重要

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

[ Deatails关注]

答案 1 :(得分:1)

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