-1

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

OLE 控件 {F9043C85-F6F2-101A-A3C9-08002B2F49FB} 的 CoCreateInstance 失败。

结果代码:0x80040154

控件是否正确注册?

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

警告:CreateDlgControls 在对话框初始化期间失败。

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

ASSERT(IsWindow(pTemp->m_hWnd));

我从http://dynamicsuser.net/forums/p/25968/140697.aspx了解到,Microsoft Common Dialog Control v6.0 可能未注册。我用 Regsrv32.exe 注册它并重新启动 Windows,但错误仍然存​​在。

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

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

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();

...

4

1 回答 1

1
  • 0x80040154REGDB_E_CLASSNOTREG。这意味着该类尚未注册。
  • {F9043C85-F6F2-101A-A3C9-08002B2F49FB}是Commom Dialog Control。

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

regsvr32 C:\Windows\SysWOW64\ComDlg32.ocx

确保在升高时执行此操作。也就是说,我希望控件能够开箱即用地注册。

最后,现在是 2015 年,你不应该再使用这个控件了。试着让自己摆脱更现代的东西。

我还要评论说您无需重新编译程序。首先,我将专注于让您现有的可执行文件在新机器上运行。

于 2015-01-07T15:37:06.233 回答