如何将具有公共控件的程序从 Visual C++ 6.0 迁移到 Visual C++ 2010(在 64 位计算机上)

How to migrate a program with Common Controls from Visual C++ 6.0 to Visual C++ 2010 (on 64-bit machine)

本文关键字:Visual C++ 2010 迁移 计算机 控件 程序      更新时间:2023-10-16

我正在尝试将Visual C++ 6.0程序(最初编写在Windows NT机器上)迁移到Visual C++ 2010,以便在我的64位Windows 7 PC上使用。程序编译正常,但运行时断言失败,在调试器中显示以下输出:

OLE control {F9043C85-F6F2-101A-A3C9-08002B2F49FB} 的

CoCreateInstance of OLE control {-F6F2-A3C9-08002B2F49FB} 失败。

结果代码:0x80040154

控件是否已正确注册?

警告: 资源项和 Win32 Z 顺序列表不同步。标签 顺序可能没有很好地定义。

警告:创建 DlgControls 在对话框初始化期间失败。

失败的断言位于occcont.cpp的第925行:

ASSERT(IsWindow(pTemp->m_hWnd));

我从 http://dynamicsuser.net/forums/p/25968/140697.aspx 了解到,Microsoft通用对话框控件v6.0可能未注册。我用Regsrv32注册了它.exe并重新启动了窗口,但错误仍然存在。

我的目标是判断这个旧程序是否可以使用新工具——而不是实际重写旧程序(尽管稍后会再说)。是否可以使旧程序在我的新机器上运行?

编辑:添加导致断言失败的代码

BOOL CCameraSimulationApp::InitInstance()
{
    AfxEnableControlContainer();
#ifdef _AFXDLL
    Enable3dControls();         // Call this when using MFC in a shared DLL
#else
    Enable3dControlsStatic();   // Call this when linking to MFC statically
#endif
    INITCOMMONCONTROLSEX InitCtrlEx;
    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrlEx.dwICC  = ICC_PROGRESS_CLASS;
  if (!InitCommonControlsEx(&InitCtrlEx))
  {
      printf("Common Controls failed to initialize");//debug
  }
    CCameraSimulationDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();

  • 0x80040154 REGDB_E_CLASSNOTREG.这意味着该类尚未注册。
  • {F9043C85-F6F2-101A-A3C9-08002B2F49FB}是逗号对话框控件。

因此,该控件似乎未注册。您尝试注册它,但我猜您注册了 64 位版本。您可能正在编译 32 位程序,因此需要注册 32 位版本。

regsvr32 C:\Windows\SysWOW64\ComDlg32.ocx

确保在提升时执行此操作。也就是说,我希望控件是开箱即用的。

最后,现在是 2015 年,您不应该再使用此控件。试着让自己断奶到更现代的东西上。

我还要评论说,你没有必要重新编译程序。首先,我会专注于让您现有的可执行文件在新机器上工作。