C++ 如何从Visual C++;6.0到Visual C++;2010(在64位计算机上)

C++ 如何从Visual C++;6.0到Visual C++;2010(在64位计算机上),c++,visual-studio-2010,visual-c++,windows-7-x64,windows-nt,C++,Visual Studio 2010,Visual C++,Windows 7 X64,Windows Nt,我试图将Visual C++ 6程序(最初在Windows NT机器上写入)到Visual C++ 2010,以用于我的64位Windows 7 PC。程序编译得很好,但是运行时断言失败,导致调试器中的下列输出: OLE控件的协同创建实例{F9043C85-F6F2-101A-A3C9-08002B2F49FB} 失败了 结果代码:0x80040154 控件是否正确注册 警告:资源项和Win32 Z顺序列表不同步。标签 顺序可能没有很好的定义 警告:CreateDlgControl在对话框初始化

我试图将Visual C++ 6程序(最初在Windows NT机器上写入)到Visual C++ 2010,以用于我的64位Windows 7 PC。程序编译得很好,但是运行时断言失败,导致调试器中的下列输出:

OLE控件的协同创建实例{F9043C85-F6F2-101A-A3C9-08002B2F49FB} 失败了

结果代码:0x80040154

控件是否正确注册

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

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

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

ASSERT(IsWindow(pTemp->m_hWnd));
据我了解,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();

  • 0x80040154
    REGDB\u E\u CLASSNOTREG
    。这意味着该类尚未注册
  • {F9043C85-F6F2-101A-A3C9-08002B2F49FB}
    是常用的对话框控件
因此,似乎该控件未注册。您试图注册它,但我猜您注册了64位版本。您可能正在编译32位程序,因此需要注册32位版本

regsvr32 C:\Windows\SysWOW64\ComDlg32.ocx regsvr32 C:\Windows\SysWOW64\ComDlg32.ocx 确保在提升时执行此操作。这就是说,我希望控件能够在开箱即用的情况下注册

最后,现在是2015年,您不应该再使用此控件。试着戒掉对更现代的东西的依赖


我还要说的是,你没有必要重新编译这个程序。首先,我将集中精力让您现有的可执行文件在新机器上工作。

我没有否决票,但如果您能找到并粘贴最终导致断言失败的代码,那就太好了,否则这个问题很难回答。另外,您是否调用此:?@SirDarius
CDialog::DoModal()
导致断言。我尝试了你的建议,函数返回true,这使我相信问题实际上不是ActiveX控件,而是我自己的代码。嗯。。。附带说明:这与ActiveX无关。我实际上是在尝试运行一个64位程序,因为它依赖于一些同样是64位的matlab DLL。无论如何,我已经尝试在提升时注册
C:\Windows\SysWOW64\ComDlg32.ocx
C:\Windows\System32\ComDlg32.ocx
,但我仍然看到相同的断言。我想完全重写控件,但不幸的是,这超出了我在这里可以做的范围。另外,旧的可执行文件在新机器上工作正常。如果旧的可执行文件工作正常,那么该控件可能已注册。在这种情况下,问题似乎在于您的代码以及如何编译代码。缺少详细信息。断言失败似乎是由函数调用引起的。这是否有用,或者我是否应该提供其他有助于描述情况的细节?我为我在这里的简短评论表示歉意,这是我第一次使用C++ GUI程序。为什么不做一些调试呢?如果您真的刚刚开始GUI编程,那么您将有一个陡峭的学习曲线。首先,您需要了解您的程序的功能。