MFC Ole Server переносится на более новую версию — AfxGetThread возвращает значение null

В настоящее время я занимаюсь переносом набора приложений MFC C++ [MFC OLE Server] с VS 2003 (в настоящее время работает в Windows XP) на VS 2010 — MFC7.1 (Windows 7).

Конкретное приложение, с которым у меня возникли проблемы, строится нормально [с удалением всех устаревших функций], но когда я пытаюсь запустить его, обе функции AfxGetThread() и AfxGetApp() в приведенной ниже функции [в winmain.cpp] возвращают NULL.

// MFC AfxWinMain source code

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
   _In_ LPTSTR lpCmdLine, int nCmdShow)
{

   ASSERT(hPrevInstance == NULL);

   int nReturnCode = -1;
   CWinThread* pThread = AfxGetThread();
   CWinApp* pApp = AfxGetApp();
   …

В Google есть документация о том, что функция AfxGetThread() меняется между версиями Visual Studio и требует реализации вашей собственной версии AfxGetThread(), но я не могу заставить фреймворк правильно вызывать эту функцию из моего приложения.

Если у кого-то есть идеи, которые были бы замечательными, спасибо, Джас.


person Jas    schedule 13.03.2014    source источник


Ответы (2)


Из этого msdn blog, похоже, вам нужно глобально создать производный CWinApp как

CMyApp theApp;

вне ваших функций.

Кроме того, код в этом ответ формы MSDN предполагает, что вам нужно позвонить

CWinApp* pApp = AfxGetApp();

перед звонком

CWinThread* pThread = AfxGetThread();
person Edward Clements    schedule 14.03.2014
comment
Спасибо. Я прочитал сообщение в блоге msdn, и в нем было достаточно подробностей о возможном сценарии. Но в моем коде у нас уже есть глобальное приложение theApp. Код, который я упомянул в своем вопросе, взят из исходного кода MFC для AfxWinMain. Также у нас есть сервер MFC Ole (exe), знаете ли вы о каких-либо изменениях Ole в MFC71, которые могут привести к тому, что AfxGetThread будет возвращать значение null? - person Jas; 14.03.2014
comment
Не могли бы вы отредактировать свой вопрос и опубликовать более сложную версию вашего основного источника, чтобы я мог воспроизвести вашу проблему? [код после AfxGetThread() и AfxGetApp() можно исключить] - person Edward Clements; 14.03.2014

Я предполагаю, что вы не написали свою собственную версию AfxWinMain.

Ваша проблема не имеет ничего общего с тем, что ваше приложение является сервером Ole. AfxGetThread обязательно вернет NULL для любого типа приложения, если не вызывается конструктор приложения, следовательно, конструктор базового класса. Это место, где устанавливаются все значения (включая указатель текущего потока выигрыша).

Я бы установил точку останова в конструкторе приложения, чтобы увидеть, вызывается ли он до AfxWinMain. Обидно, что код MFC не проверяет правильность указателей CWinThread и CWinApp и допускает необработанное исключение.

person JohnCz    schedule 15.03.2014