我有一个使用古老(约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的错误,但似乎无法在这个上找到任何内容。
谢谢,
克里斯
答案 0 :(得分:0)
我最终没有找到解决方案 - 将控件升级到与VS2010兼容的版本。
答案 1 :(得分:0)
值得一提:如果你不关心控件是否显得透明,你可以强制控件有一个窗口 - 即使它可以在没有窗口的情况下运行。
你看,ActiveX控件必须首先询问容器(将托管控件的窗口),如果可以在没有窗口的情况下激活它。这只是因为并非所有容器都支持无窗口激活。
如果此接口(IOleInPlaceSiteWindowless
)返回正常,则继续执行此特殊的无窗口激活,否则将正常为控件创建窗口。
声明: 我不知道这个“不必要的”窗口是否会使断言失败消失。换句话说:我不知道窗口句柄是否已经“深入”传递到AX控件中。
有关IOleInPlaceSiteWindowless
界面的更多信息:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682300(v=vs.85).aspx