DLL, использующая MFC без CWinApp? - PullRequest
2 голосов
/ 10 марта 2011

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

Перефразировано: В Win32 DLL я использую некоторые классы 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();
}

Ответы [ 2 ]

1 голос
/ 14 марта 2011

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

0 голосов
/ 29 ноября 2018

Класс 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);
}

Так что создание так называемой непосредственно в основной функции также работает.

...