我最近遇到了一个使用MFC对话框的DLL(github)(例如,它导入"afxdlg.h"
并调用CFileDialog
)并且似乎静态链接到MFC,但是没有基于CWinApp
的课程。我有点困惑:是不是MFC DLL?怎么没有CWinApp
?
重新描述:在Win32 DLL中,我使用了一些MFC类(例如,我包括"afxdlgs.h"
并使用CFileDialog
)并静态链接MFC。没有DllMain
。最终的DLL会从Win32或MFC中获得DllMain
吗?
如果它选择MFC版本,那么另一个问题:使用DllMain
(无线程)使用MFC DllMain
的Win32 DLL的最简单方法是什么?以下是否正确?
#include "afx.h" /* correct? */
class MyDll: public CWinApp
{
public:
/* do I need constructor and destructor here? */
virtual BOOL InitInstance();
virtual BOOL ExitInstance();
} theDll;
BOOL
MyDLL::InitInstance()
{
CWinApp::InitInstance();
/* code from old DllMain, DLL_PROCESS_ATTACH.
For hInst use theDll.m_hInstance */
return TRUE;
}
BOOL
MyDLL::ExitInstance()
{
/* code from old DllMain, DLL_PROCESS_DETACH */
return CWinApp::ExitInstance();
}
答案 0 :(得分:1)
我认为将标准dll转换为MFC dll的最简单方法是创建一个新的MFC-dll项目,然后使用生成的文件并将其余代码粘贴到其中。
AFAIK源文件没有区别,但链接器设置中有一些。从新项目开始可以节省大量时间和麻烦。
答案 1 :(得分:0)
CWinApp类不过是一个受控类,它将在main / tmain函数中调用,该函数将在启动过程时作为起点。由于MFC只是一个库,因此根据项目属性中给出的标志,它也可以在常规控制台应用程序中使用。
cwinapp的实例是通过appmodul.cpp中的函数AfxWinMain创建的
/////////////////////////////////////////////////////////////////////////////
// export WinMain to force linkage to this module
extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow);
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
因此直接在main函数中创建所谓的项也可以。