【发布时间】: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 的错误,但似乎在这个项目上找不到任何东西。
谢谢,
克里斯
【问题讨论】:
-
抱歉,我认为这无关紧要:“在 Visual Studio 2005 SP1 中使用 ActiveX 控件开发或迁移 MFC 应用程序。”
-
在从 VS2008 项目升级之前,是否有任何从 typelib 导入或类似内容生成的代码?其中一些文件不会被清理删除。
-
是的,它们会在源代码控制下。明天我会尝试重新导入它。
-
我无法重新导入控件。我想这只是行不通。猜猜我们会花 1000 美元购买最新版本……
标签: visual-studio-2010 visual-c++ mfc activex