使用没有CWinApp的MFC的DLL?

时间:2011-03-10 08:27:02

标签: dll mfc

我最近遇到了一个使用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();
}

2 个答案:

答案 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函数中创建所谓的项也可以。