IsWindow(activeX.GetSafeHwnd()) 升级到 VS2010 后总是 false

Posted

技术标签:

【中文标题】IsWindow(activeX.GetSafeHwnd()) 升级到 VS2010 后总是 false【英文标题】:IsWindow(activeX.GetSafeHwnd()) always false after upgrade to VS2010 【发布时间】:2011-10-31 16:23:06 【问题描述】:

我有一个使用古老(大约 1999 年)第三方 ActiveX 控件的 MFC 应用程序。

自从将项目从 VS2008 升级到 VS2010 后,我遇到了问题...

在父对话框的 OnSize 处理程序中,IsWindow 始终为 control.GetSafeHwnd() 返回的句柄返回 false,即使 GetSafeHwnd() 返回非 NULL 值也是如此。控件的父对话框的其余部分显示正常,但似乎没有响应任何输入。

我见过this article,但在这种情况下 GetSafeHwnd() 没有返回 NULL(在第一次调用它之后,也就是在控件实例化之前)。

控件确实会导致在加载时输出跟踪消息“控件想要无窗口”。然而,它在 VS2008 中编译时也会这样做,所以这可能是一个红鲱鱼。搜索此消息将我指向创建从 COleControlSite 派生的类,并否认控件无窗口,但似乎没有可用的好示例,正如我所说,尚不清楚这是否真的是问题。

我在MSDN's VS2010 porting page 上也发现了这个问题:

"使用 Visual C++ 6.0 编译的 ActiveX 控件,嵌入到 使用 Visual C++ 2010 开发的项目中的对话框,可能 使您的程序在运行时断言。在这种情况下,打开 与 Visual C++ 中的 ActiveX 控件关联的 ATL 或 MFC 项目 2010,然后重新编译它..断言将在文件 occccont.cpp 中, 在源代码的这一行:ASSERT(IsWindow(pTemp->m_hWnd))。”

我认为 VS6 编译的 ActiveX 控件存在某些问题,导致当前 Win32 实现 IsWindow 将窗口句柄视为无效。建议的解决方案当然没有帮助,因为它是第三方控件,我们无法重新编译它。

有没有人设法解决这个问题?

我已经找到了针对不在 Windows 2000 上运行的 VS2010 项目的解决方案,以及链接到 ODBC 的错误,但似乎在这个项目上找不到任何东西。

谢谢,

克里斯

【问题讨论】:

support.microsoft.com/kb/949107 抱歉,我认为这无关紧要:“在 Visual Studio 2005 SP1 中使用 ActiveX 控件开发或迁移 MFC 应用程序。” 在从 VS2008 项目升级之前,是否有任何从 typelib 导入或类似内容生成的代码?其中一些文件不会被清理删除。 是的,它们会在源代码控制下。明天我会尝试重新导入它。 我无法重新导入控件。我想这只是行不通。猜猜我们会花 1000 美元购买最新版本…… 【参考方案1】:

我最终没有找到解决方案 - 将控件升级到与 VS2010 兼容的版本。

【讨论】:

【参考方案2】:

为了它的价值:如果您不在乎控件是否会显示为透明,则可以强制控件具有窗口——即使它可以在没有窗口的情况下运行。

你看,ActiveX 控件必须首先询问容器(将承载控件的窗口)是否可以在没有窗口的情况下激活。这仅仅是因为并非所有容器都支持无窗口激活。

如果此接口 (IOleInPlaceSiteWindowless) 返回正常,则继续进行此特殊的无窗口激活,否则将正常为控件创建一个窗口。

免责声明: 我不知道这个“不必要的”窗口是否会使断言失败消失。换句话说:我不知道窗口句柄是否足够“深入”地传递到 AX 控件中。

更多关于IOleInPlaceSiteWindowless接口: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682300(v=vs.85).aspx

【讨论】:

以上是关于IsWindow(activeX.GetSafeHwnd()) 升级到 VS2010 后总是 false的主要内容,如果未能解决你的问题,请参考以下文章

[MFC]GetWindowText()

jQuery源码解析 -- 概述

OnInitDialog() 中的断言失败

jQuery学习手册

JQuery源码解析-JQuery的工具方法

window.external 是不是同步