Библиотека MFC является объектно-ориентированной и поэтому нам нужен наш класс приложения. Добавим его в проект HMFC.
И дадим ему имя CWinApp.
Класс у нас есть. Теперь идея такая. Любая программа должны обрабатывать сообщения. То есть после WinMain должен начинаться цикл обработки сообщений. Вот и пусть он будет у нас в классе в смысле цикл обработки. Для этого в классе создадим функцию Run которая и будет запускать этот цикл обработки сообщений.
// H class CWinApp { public: int Run(); // Запуск цикла обработки сообщений CWinApp(); virtual ~CWinApp(); }; // CPP #include "stdafx.h" #include "WinApp.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CWinApp::CWinApp() {} CWinApp::~CWinApp() {} ////////////////////////////////////////////////////////////////////// // Function ////////////////////////////////////////////////////////////////////// int CWinApp::Run() { return 0; }
Из WinMain мы должны эту функцию запустить. Но ведь мы не знаем кокой будет класс так как потом люди могут этот класс наследовать и так далее. Поэтому нам нужно завести глобальную ссылку на этот класс что бы используя ее могли добираться до этого класса. Вот мы ее и заведем.
// WinApp.cpp: implementation of the CWinApp class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "WinApp.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// extern CWinApp* afxCurrentWinApp=NULL; CWinApp::CWinApp() ..................
Но помимо этого мы опишем и глобальную функцию доступа к этой переменной.
class CWinApp { .............. }; CWinApp* AfxGetApp(); #endif // !defined(AFX_WINAPP_H__72790F55_793D_11D5_B617_CC607CDC9F5A__INCLUDED_)
Реализации ее.
////////////////////////////////////////////////////////////////////// // Function ////////////////////////////////////////////////////////////////////// int CWinApp::Run() { return 0; } CWinApp* AfxGetApp() { return afxCurrentWinApp; }
Изменим конструкт CWinApp то есть при создании объект CWinApp у вас автоматически инициализируется afxCurrentWinApp
CWinApp::CWinApp() { afxCurrentWinApp = this; }
Теперь нам нужно подключить заголовочный файл самого Windows.
......... #endif // _MSC_VER > 1000 #include "windows.h" class CWinApp { .........
Собирайте проект и переходите в TestMyLib, Подключим заголовочный файл и проведем испытания.
// TestMyLib.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "HMFC\\WinApp.h" #pragma comment(lib,"HMFC\\Debug\\HMFC.lib") // там наш код библиотеки int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { CWinApp ap; ap.Run(); return 0; }