我目前正在将一套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()的文档 - 但我无法让框架从我的应用程序中正确调用此函数。
如果有人有任何想法会很棒, 谢谢 雅
答案 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指针的有效性,并允许未处理的异常。