【发布时间】:2018-08-31 04:17:07
【问题描述】:
我有一个内置于 VS2010 的旧版 OCX 控件,并在 VB6 ActiveX EXE 中使用。当我注册 OCX 的调试版本并尝试使用 VB6 构建它时,我收到错误
如果我注册了 Release 版本,那么 VB ActiveX EXE 容器就会编译并运行。我已经在线搜索了这个错误,但结果不是很丰富。目前还不清楚错误是否意味着它根本找不到 OCX 类型,或者 OCX 接口中是否存在 VB 不支持的类型。错误指向第一次尝试在VB源代码中使用OCX对象。
170 m_SignCaptureForm.SigPlus1.TabletComTest = False
其中 SigPlus1 是 OCX 对象。从 OLE/COM Object Viewer 查看 TypeInfo,我看到的 Debug 和 Release 之间的唯一区别是所有 BOOL 返回类型在 Debug 版本中都定义为 char 和在发布版本中作为 VARIANT_BOOL。
========OLE/COM Object Viewer TypeInfo for Debug ========
char TabletLCDMode;
[id(0x00000010)
]
=========OLE/COM Object Viewer TypeInfo for Release ========
VARIANT_BOOL TabletLCDMode;
[id(0x00000010)
]
我可以看到 OCX 源代码中没有任何内容会影响这些声明在 Debug 与 Release 中的不同。我要问的是为什么我会收到此错误,如果原因是 BOOL 类型的差异,有什么补救措施?
ocx.h: afx_msg BOOL GetTabletLCDMode();
ocx.cpp: DISP_PROPERTY_EX(CSigPlusCtrl, "TabletLCDMode", GetTabletLCDMode, SetTabletLCDMode, VT_BOOL)
【问题讨论】:
-
您是否安装了调试运行时支持?
-
在构建调试版本和发布版本时,编译器采用不同的优化并具有不同的错误检查功能。这意味着一些错误可能会在调试版本中捕获,而其他错误可能会在发布版本中捕获。如果两者不同,您可能在某处有错误。编译器不需要诊断所有错误,也可能无法诊断。
-
在调试模式下看起来像某人“#defined”
VT_BOOL为char。您可以尝试定义它ocx.cpp以获取有关redef 指向初始错误定义位置的预处理器错误。 -
@AA 我使用 Visual Studio 查看了定义,其中设置了 Release 和 Debug 的构建配置,两种配置中的 VT_BOOL 是一个值为 11 的枚举 VARENUM。两种情况下的 BOOL 都是 typedef int BOOL ;
-
查看您的 ODL 文件及其 MIDL 设置,了解调试和发布配置之间的差异。 MFC 调度映射不用于 TypeLib,因此问题不应该出现在 cpp 文件中。
标签: c++ visual-studio vb6 ole ocx