вызов диалога из dll
От: drummer  
Дата: 29.10.02 18:56
Оценка:
Вот возникла такая проблема:
я хочу в в программе вызвать mfc-диалог. В общем то вызов диалога идет не напрямую, а из экспортируемой функции. Проблема в том , что данная функция "обычная" (не mfc), и из нее диалог не вызывается. И я по незнанию и неопытности не знаю как такое осуществить (если это вообще возможно) — вызвать мфс-шный диалог из обычной функции. Или придется экспортировать классы???


И еще вопрос вдогонку%) Как опять же из длл загрузить вид(:CFormView) в свое окно. Есть кто-нибудь такое делал, то нельзя ли маленький примерчик...?

Заранее огромное спасибо
Re: вызов диалога из dll
От: Patalog Россия  
Дата: 30.10.02 07:29
Оценка:
Здравствуйте drummer, Вы писали:

D>Вот возникла такая проблема:

D>я хочу в в программе вызвать mfc-диалог. В общем то вызов диалога идет не напрямую, а из экспортируемой функции. Проблема в том , что данная функция "обычная" (не mfc), и из нее диалог не вызывается. И я по незнанию и неопытности не знаю как такое осуществить (если это вообще возможно) — вызвать мфс-шный диалог из обычной функции. Или придется экспортировать классы???

D>

D>И еще вопрос вдогонку%) Как опять же из длл загрузить вид(:CFormView) в свое окно. Есть кто-нибудь такое делал, то нельзя ли маленький примерчик...?

Заюзай для етой цели MFC dll Wizard (MFC extention dll) и будет тебе щастье.
Почетный кавалер ордена Совка.
Re[2]: вызов диалога из dll
От: Аноним  
Дата: 30.10.02 09:10
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте drummer, Вы писали:


D>>Вот возникла такая проблема:

D>>я хочу в в программе вызвать mfc-диалог. В общем то вызов диалога идет не напрямую, а из экспортируемой функции. Проблема в том , что данная функция "обычная" (не mfc), и из нее диалог не вызывается. И я по незнанию и неопытности не знаю как такое осуществить (если это вообще возможно) — вызвать мфс-шный диалог из обычной функции. Или придется экспортировать классы???
>Заюзай для етой цели MFC dll Wizard (MFC extention dll) и будет тебе щастье.

это для вызова

void CTestDllDlg::OnBnClickedButton1()
{
HMODULE hLib;
hLib = LoadLibrary("Dl.dll");
if(hLib)
{
void (*F7)();
(FARPROC &)F7 = GetProcAddress(hLib,"F7");
F7();
}
else
{
AfxMessageBox("Dll not found!");
}

// TODO: Add your control notification handler code here
}




это в библиотеке dll

cpp

__declspec(dllexport) void F7()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CM6 dlg7;
dlg7.DoModal();
}


и в h

extern "C"{__declspec(dllexport) void F7();}



и усе......
Re[3]: вызов диалога из dll
От: Patalog Россия  
Дата: 30.10.02 09:47
Оценка:
Здравствуйте Аноним, Вы писали:

[]

А>__declspec(dllexport) void F7()

А>{
А> AFX_MANAGE_STATE(AfxGetStaticModuleState());
А> CM6 dlg7;
А> dlg7.DoModal();
А>}

А>

А>и в h

А>extern "C"{__declspec(dllexport) void F7();}


А>


А>и усе......


Ну, можно и так...
Почетный кавалер ордена Совка.
Re[4]: вызов диалога из dll
От: Аноним  
Дата: 30.10.02 10:22
Оценка:
Здравствуйте Patalog, Вы писали:


P>Ну, можно и так...

не_то, что можно а Нуно .... вот с Видом там по другому ....
Re[5]: вызов диалога из dll
От: drummer  
Дата: 30.10.02 13:30
Оценка:
Здравствуйте Аноним, Вы писали:

А>не_то, что можно а Нуно .... вот с Видом там по другому ....

Если можно поподробнее Как вместо вида, используемого в приложении сначала вставить вид из библиотеки...
Re[3]: вызов диалога из dll
От: drummer  
Дата: 30.10.02 15:37
Оценка:
Здравствуйте Аноним, Вы писали:

А>__declspec(dllexport) void F7()

А>{
А> AFX_MANAGE_STATE(AfxGetStaticModuleState());
А> CM6 dlg7;
А> dlg7.DoModal();
А>}
А>
А>и в h

А>extern "C"{__declspec(dllexport) void F7();}

А>и усе......
я в принципе так и делал, но программа вылетает на ASSERTах (причем не виснет — после нескольких сообщений об ошибке (ASSERT) диалог загружается и все ок)
Вот мой кусок кода (с некоторыми незначительными сокращениями, не влияющими на мою проблему):


dll h:
extern "C" {__declspec(dllexport) void* FormInputStructure();}

dll cpp:
__declspec(dllexport) void* FormInputStructure()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

void *res = NULL;
CInputDlg dlg;
if(dlg.DoModal()==IDOK)
{

}
else
{

}
return res;
}


вызов dll:

typedef void* (*FORM_INPUT)();

void LoadFunc(char* path)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

HMODULE hDll = LoadLibrary(path);
if(hDll!=NULL)
{
FORM_INPUT fInput = (FORM_INPUT) GetProcAddress(hDll,"FormInputStructure");
if(fInput!=NULL)
{
void* params = fInput();
}
else
{
}

FreeLibrary(hDll);
return S_OK;
}
}


Что (кроме рук ) надо подправить???
Re[4]: вызов диалога из dll
От: Аноним  
Дата: 30.10.02 16:10
Оценка:
для вида ....

void CMainFrame::OnViewLoadviewfromdll()
{
typedef UINT ( * LPDLLFUNC)(CRuntimeClass**);
LPDLLFUNC lpfnDllFunc = NULL;
HINSTANCE hDLL = NULL;
hDLL = AfxLoadLibrary("InitialContact.dll");
if(hDLL)
{
lpfnDllFunc = (LPDLLFUNC)::GetProcAddress(hDLL,"Init");
if (!lpfnDllFunc)
{
AfxMessageBox("Function not found in DLL");
FreeLibrary(hDLL);
return;
}
CRuntimeClass* pNewViewClass;
lpfnDllFunc(&pNewViewClass);
ASSERT(pNewViewClass);
CSdiDllFramesDoc* pDoc = (CSdiDllFramesDoc*) GetActiveDocument();
ASSERT(pDoc);
pDoc->SwitchToView(pNewViewClass);
}
else
{
AfxMessageBox("Dll not found!");
}
}


погляди мой код, я его использую — без проблем ......
Re[5]: вызов диалога из dll
От: drummer  
Дата: 31.10.02 16:24
Оценка:
Здравствуйте Аноним, Вы писали:

А>

А>погляди мой код, я его использую — без проблем ......
если ты про загрузку диалога, то мой то вариант вроде не отличается... или я не прав?
Все то же самое, но вылетает как будто я что то недоподключил или недоинициализовал...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.