MFC Ole Server移植到较新版本 - AfxGetThread返回null

时间:2014-03-13 11:10:29

标签: c++ visual-c++ mfc porting

我目前正在将一套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()的文档 - 但我无法让框架从我的应用程序中正确调用此函数。

如果有人有任何想法会很棒, 谢谢 雅

2 个答案:

答案 0 :(得分:0)

this msdn blog开始,您似乎需要全局实例化您的派生CWinApp

CMyApp theApp;

在你的职能之外。

或者,此MSDN form answer中的代码表明您需要调用

CWinApp* pApp = AfxGetApp();

之前

CWinThread* pThread = AfxGetThread();

答案 1 :(得分:0)

我认为你没有编写自己的AfxWinMain版本。

您的问题与您的应用是Ole服务器无关。 如果是应用程序的构造函数,AfxGetThread肯定会为任何应用程序类型返回NULL,因此不会调用基类构造函数。这是一个设置所有值(包括当前获胜线程指针)的地方。

我会在应用程序的构造函数中设置断点,以查看在 AfxWinMain之前是否称为。 遗憾的是,MFC代码不检查CWinThread和CWinApp指针的有效性,并允许未处理的异常。