不支持无窗口 ActiveX 控件

Posted

技术标签:

【中文标题】不支持无窗口 ActiveX 控件【英文标题】:Windowless ActiveX controls are not supported 【发布时间】:2009-10-07 13:16:04 【问题描述】:

我有一个 C# .NET 2.0 应用程序,它加载作为 ActiveX 控件(.ocx 文件)的旧版 VB6 模块(我们尚未转换),应用程序通过互操作从主 C# .NET 表单加载这些模块。

自 .NET 2.0 的 service pack 2 以来,我们的用户遇到了随机错误,应用程序将抛出“”错误。 ActiveX 控件不是无窗口的。

这似乎是其他人遇到的问题,但我没有找到有效的灵魂。

经常提供的解决方案之一是关闭进程的 DEP,我已经尝试过了。

以前有人遇到过这个问题吗?

【问题讨论】:

【参考方案1】:

您的问题与使用 MSWLESS.OCX 中的控件有关。您可能必须用常规的 VB 等效项替换此 OCX 中使用的所有控件。两组控件之间没有太多功能差异,因此您可能会很幸运。

几年前,当问题开始出现时,我摆脱了我的 Windowless VB 控件。如果我没记错的话,我主要是在 .frm 文件中进行搜索和替换来替换控件。


更新:

哇,这真的很糟糕。您的 Active X 控件是否可能实际上是无窗口的? UserControl 上有一个名为 WindowLess 的属性,它使您的控件无窗口。是否为您的任何用户控件设置为 True?

【讨论】:

我们没有在任何地方使用 MSWLESS.OCX。我做了仔细检查以确保。 检查整个 VB 源代码树以确保没有 Windowless 设置为 True。这是一个间歇性问题,即用户不会一直得到它。似乎是应用程序的循环使用,即始终打开和关闭相同的 VB 窗口。 @Darrel Miller:仅供参考,如果托管容器不支持无窗口控件,它会使用“窗口化”实例化。因此,在 VB6 中,您可以将控件标记为“支持无窗口”实例化,但它始终支持“有窗口”实例化。这就是为什么在 Access 表单中,ActiveX 控件将始终获得单独的 hWnd,因为 Access 容器不知道如何“无窗口”托管。因此,Access 表单中的“无窗口”VB6 用户控件“变为”“有窗口”(UserControl.hWnd <> 0)。 @wqw 好的,这是有道理的。你每天都能学到新东西!

以上是关于不支持无窗口 ActiveX 控件的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器(Chrome)不支持IE的Activex控件吗?

js判断ActiveX控件是不是安装

AfxEnableControlContainer()

chrome中怎么用js调用activex控件中的方法

无窗口插件1

基于MFC的ActiveX控件开发教程------------浏览器插件之ActiveX开发