升级到VS2010后,IsWindow(activeX.GetSafeHwnd())始终为false

时间:2011-10-31 16:23:06

标签: visual-studio-2010 visual-c++ mfc activex

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

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

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

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

控件确实会在加载时输出跟踪消息“Control want to be windowless”。但是在VS2008中编译时也会这样做,所以这可能是一个红色的鲱鱼。搜索此消息指向我创建一个派生自COleControlSite的类,并拒绝控制无窗口,但似乎没有这个可用的好例子,正如我所说,目前尚不清楚这是否真的是导致问题

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

  

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

我假设有一些关于VS6编译的ActiveX控件的东西会导致窗口句柄被IsWindow的当前Win32实现视为无效。建议的解决方案当然没有用,因为它是第三方控件,我们无法重新编译它。

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

我已经找到了VS2010项目没有在Windows 2000上运行的解决方案,以及链接到ODBC的错误,但似乎无法在这个上找到任何内容。

谢谢,

克里斯

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

值得一提:如果你不关心控件是否显得透明,你可以强制控件有一个窗口 - 即使它可以在没有窗口的情况下运行。

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

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

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

有关IOleInPlaceSiteWindowless界面的更多信息: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682300(v=vs.85).aspx