Показать диалог из MFC DLL - PullRequest
0 голосов
/ 15 июня 2011

Я загрузил форму, но только кнопки без функций

HMODULE hModule = LoadLibrary(L"Tools.dll");

if (hModule != NULL)
{
    AfxSetResourceHandle(hModule);
    CDialog dgl(MAKEINTRESOURCE(199), NULL);
    dgl.DoModal(); 
}

, так как я могу загрузить полную функцию формы и у меня нет исходного кода DLL

Ответы [ 2 ]

2 голосов
/ 11 ноября 2014

Чтобы отобразить диалоговое окно из MFC dll, как в сценарии - вы экспортировали функцию в DLL, и из этой функции вы вызываете DoModel(). Этот шаблон фактически хранится в модуле DLL. Вам нужно изменить состояние модуля, чтобы текущий дескрипторused.You можно сделать это с помощью:

AFX_MANAGE_STATE(AfxGetStaticModuleState());

AFX_MODULE_STATE AfxGetStaticModuleState()

-> The AFX_MODULE_STATE структура содержит глобальные данные для модуля, то есть часть состояния модуля, которая выдвигается или выталкивается.

IN DLL-код будет выглядеть так:

AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg objMyDlg;
iRet = objMyDlg.DoModal(); 
0 голосов
/ 16 июня 2011

Это возможно только в том случае, если вы уверены, что реализация класса диалога основана на MFC и класс экспортируется из Tools.dll. Вы можете попробовать проверить .dll с помощью утилиты Dependency Walker .
Обратите внимание, имя компилятора искажает конструктор. Вот что я получил за следующую декларацию.

class __declspec(dllexport) TestDialog : public CDialog
{
public:
    TestDialog()
        :CDialog(10)
    {

    }
};

Имя искалеченного конструктора: ?? _ 7TestDialog @@ 6B @

Возможно, вы сможете воссоздать заголовок класса диалога на основе результатов вашей проверки. Вы также должны убедиться, что у вас одна и та же версия MFC для Tools.dll и вашего приложения.

...