我有一个内置于VS2010中的旧版OCX控件,该控件已在VB6 ActiveX EXE中使用。当我注册OCX的调试版本并尝试使用VB6进行构建时,出现错误c++ - OCX的调试和发行版不兼容 “Variable uses an Automation type not supported in Visual Basic”-LMLPHP

如果我注册发布版本,则VB ActiveX EXE容器会编译并运行。我已经在线搜索了此错误,但结果不是很有帮助。目前尚不清楚该错误是否表示根本找不到OCX类型,或者OCX接口(interface)中是否存在VB不支持的类型。该错误指向VB源代码中首次尝试使用OCX对象。

170 m_SignCaptureForm.SigPlus1.TabletComTest = False

其中SigPlus1是OCX对象。从OLE / COM Object Viewer中查看TypeInfo,我看到的Debug和Release之间的唯一区别是,所有的BOOL返回类型在Debug版本中都定义为 char ,在Release版本中定义为 VARIANT_BOOL

========用于调试的OLE / COM对象查看器TypeInfo ========
      char TabletLCDMode;
      [id(0x00000010)
]

=========发行版的OLE / COM对象查看器TypeInfo ========
      VARIANT_BOOL TabletLCDMode;
      [id(0x00000010)
]

OCX源代码中没有什么可以影响这些声明的,因为它们在Debug vs Release中并不相同。我要问的是为什么我会收到此错误,并且如果原因是BOOL类型不同,那么该如何解决?
ocx.h:    afx_msg BOOL GetTabletLCDMode();
ocx.cpp:  DISP_PROPERTY_EX(CSigPlusCtrl, "TabletLCDMode", GetTabletLCDMode, SetTabletLCDMode, VT_BOOL)

最佳答案

在@A之后。我发现了解决方案,建议检查OCX项目ODL文件(SigPlus.odl)的属性设置。

查看SigPlus.odl文件的属性时,“发布”和“调试”设置有所不同。要访问ODL属性,请在解决方案资源管理器中右键单击源文件中的.ODL文件。使Debug版本将bool声明为char的设置是 MkTypeLib兼容的选项。调试版本将此设置为“否”,而“发行版本”将其设置为"is"。一旦我将调试版本更改为 MkTypeLib兼容:是,则来自OLE / COM对象查看器的TypeInfo将 bool(boolean) 值显示为VARIANT_BOOL,就像发布版本和VB ActiveX EXE容器一样,现在可以成功构建了。

c++ - OCX的调试和发行版不兼容 “Variable uses an Automation type not supported in Visual Basic”-LMLPHP
c++ - OCX的调试和发行版不兼容 “Variable uses an Automation type not supported in Visual Basic”-LMLPHP

10-08 08:34