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

Visual studio 2010 升级到VS2010后,IsWindow(activeX.GetSafeHwnd())始终为false,visual-studio-2010,visual-c++,mfc,activex,Visual Studio 2010,Visual C++,Mfc,Activex,我有一个MFC应用程序,它使用一个古老的(大约1999年)第三方ActiveX控件 自从将项目从VS2008升级到VS2010后,我遇到了一些问题 在父对话框的OnSize处理程序中,IsWindow始终为control.GetSafeHwnd()返回的句柄返回false,即使GetSafeHwnd()返回非NULL值。控件的父对话框的其余部分显示良好,但它似乎不响应任何输入 我已经看到了,但是GetSafeHwnd()在本例中没有返回NULL(在第一次调用它之后,也就是在实例化控件之前) 控件

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

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

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

我已经看到了,但是GetSafeHwnd()在本例中没有返回NULL(在第一次调用它之后,也就是在实例化控件之前)

控件在加载时确实会导致跟踪消息“控件希望无窗口”输出。然而,当在VS2008中编译时,它也会这样做,因此这可能是一种误导。搜索此消息意味着我创建了一个从COleControlSite派生的类,并否认了控件的无窗口性,但似乎没有这方面的好例子,正如我所说的,不清楚这是否是问题的真正原因

我还发现在以下网站上提到了这个问题:

一个使用Visual C++ 6编译的ActiveX控件,嵌入时 一个使用Visual C++ 2010开发的项目对话框 使程序在运行时断言。在这种情况下,请打开 Visual C++中与ActiveX控件相关的ATL或MFC项目 2010,并重新编译..断言将位于occcont.cpp文件中, 在source中的这一行:ASSERT(IsWindow(pTemp->m_hWnd))。”

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

有人设法避开这件事吗

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

谢谢


Chris

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

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

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

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

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

有关
IOleInPlaceSiteWindowless
界面的更多信息:

抱歉,我认为这与“在Visual Studio 2005 SP1中使用ActiveX控件开发或迁移MFC应用程序”无关。在VS2008项目升级之前,是否有从typelib导入或类似导入生成的代码?这些文件中的一些不会被清除。是的,它们会被删除,因为它们受源代码管理。我将尝试明天重新导入。我无法重新导入控件。我想这是行不通的。我猜我们会花1000美元购买最新版本。。。