Пренасяне на MFC Ole сървър към по-нова версия – AfxGetThread връща нула

В момента съм в процес на пренасяне на пакет от 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() – но не мога да накарам рамката да извика тази функция правилно от моето приложение.

Ако някой има някакви идеи, ще бъде страхотно, благодаря, Jas


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


Отговори (2)


От този msdn blog, изглежда, че трябва глобално да създадете своя извлечен CWinApp like

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 да върне нула? - person Jas; 14.03.2014
comment
Бихте ли могли да редактирате въпроса си и да публикувате по-комплектирана версия на вашия основен източник, за да мога да възпроизведа проблема ви? [кодът след AfxGetThread() и AfxGetApp() може да бъде изключен] - person Edward Clements; 14.03.2014

Предполагам, че не сте написали своя собствена версия на AfxWinMain.

Вашият проблем няма нищо общо с факта, че приложението ви е Ole сървър. AfxGetThread определено ще върне NULL за всеки тип приложение, ако конструкторът на приложението, следователно конструкторът на базовия клас не се извиква. Това е място, където се задават всички стойности (включително текущия указател на win нишка).

Бих задал точка на прекъсване в конструктора на приложението, за да видя дали се извиква преди AfxWinMain. Жалко е, че кодът на MFC не проверява валидността на указателите CWinThread и CWinApp и позволява необработено изключение.

person JohnCz    schedule 15.03.2014