DLL с использованием MFC без CWinApp?

Недавно я наткнулся на DLL (github), которая использует диалоги MFC ( например, он импортирует "afxdlg.h" и вызывает CFileDialog) и, по-видимому, статически связывается с MFC, но не имеет класса, основанного на CWinApp. Я несколько запутался: это DLL MFC или нет? Почему у него нет CWinApp?

Перефразировано: в DLL Win32 я использую некоторые классы MFC (например, я включаю "afxdlgs.h" и использую CFileDialog) и статически связываю MFC. DllMain нет. Будет ли окончательная DLL иметь DllMain из Win32 или из MFC?

Если он выбирает версию MFC, тогда другой вопрос: как проще всего сделать Win32 DLL с DllMain (без потоков) для использования MFC DllMain? Правильно ли следующее?

#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();
}

person Mikhail Edoshin    schedule 10.03.2011    source источник


Ответы (2)


Я думаю, что самый простой способ преобразовать стандартную dll в dll MFC - это создать новый проект MFC-dll, а затем использовать сгенерированные файлы и вставить в него остальную часть вашего кода.

Насколько я знаю, в исходных файлах разницы нет, но в настройках компоновщика она есть. Начиная с нового проекта экономит много времени и усилий.

person dwo    schedule 14.03.2011

Класс CWinApp — это не что иное, как управляемый класс, который будет вызываться в функции main/tmain, которая станет отправной точкой при запуске процесса. Поскольку MFC — это просто библиотека, ее можно использовать и в общем консольном приложении в соответствии с флагами, указанными в свойствах проекта.

Экземпляр cwinapp создается из функции AfxWinMain в appmodul.cpp.

/////////////////////////////////////////////////////////////////////////////
// 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 также работает.

person Karthik Krish    schedule 29.11.2018