不支持无窗口 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 控件的主要内容,如果未能解决你的问题,请参考以下文章