Комментарий, который вы вставили в свой код, содержит ответ:
// Crash here: "hr = 0x800401f0 CoInitialize has not been called."
Значение HRESULT
говорит о том, что вам нужно вызвать функцию CoInitialize
, чтобы инициализировать библиотеку COM для потока вашего приложения.
Конечно, сообщение немного устарело. Как вы увидите в вышеупомянутой документации, все новые приложения должны вместо этого вызывать функцию CoInitializeEx
. Не беспокойтесь: он делает то же самое, что и его старший брат.
Как указано в разделе «Замечания» документации:
CoInitializeEx
должен вызываться как минимум один раз и обычно вызывается только один раз для каждого потока, использующего библиотеку COM. [. , , ] Вам необходимо инициализировать библиотеку COM в потоке перед вызовом любой из функций библиотеки, кроме CoGetMalloc
, чтобы получить указатель на стандартный распределитель и функции выделения памяти. В противном случае функция COM вернет CO_E_NOTINITIALIZED
.
Вы говорите, что не используете COM, но это неверно. Возможно, вы не используете его явно, но Windows и инфраструктура MFC определенно используют его "за кулисами". Все функции регистрации типов файлов зависят от COM. Скелетный код, созданный мастером проекта MFC в Visual Studio 2010, автоматически вставил соответствующий код регистрации COM, но, поскольку вы обновили существующий проект с VC ++ 6, вы, похоже, пропустили этот важный шаг.
В MFC функция AfxOleInit
также инициализирует COM для текущей квартиры вызывающего приложения, так же как и функция OleInitialize
внутренне. Убедитесь, что ваша переопределенная функция InitInstance
содержит вызов одной из этих функций.
Например, в новом новом проекте MFC, созданном мастером VS 2010, функция InitInstance
выглядит примерно так:
BOOL CTestApp::InitInstance()
{
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// Initialize OLE libraries
if (!AfxOleInit()) // ** MAKE SURE THAT YOU CALL THIS!! **
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// . . .
// a bunch more boring initialization stuff...
// The one and only window has been initialized, so show and update it
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}