2016-08-10 5 views
0

Я пишу DLL (MS VS13, C++), что называется внешней программой и которая использует стандартизированный список параметров:MFC Dialog в не-MFC приложение

extern "C" __declspec(dllimport) int TYPE850(double &time, double xin[], double xout[], double &t, double &dtdt, double par[], int info[], int icntrl); 

Результаты подпрограммы написаны в массив xout [], чтобы вызывающая программа могла читать и обрабатывать результаты DLL.

Теперь я хочу добавить диалог в DLL, который может принимать пользовательский ввод каждый раз, когда вызывается DLL. Идея заключается в использовании MFC. Оказалось, что не просто добавить код MFC в существующий DLL-код, поэтому я пытаюсь сделать это наоборот: я создаю регулярную библиотеку MFC DLL и ресурс диалога и добавляю исходный DLL-код. Код будет выглядеть следующим образом (без включаемых заявлений):

BEGIN_MESSAGE_MAP(CType850LibApp, CWinApp) 
END_MESSAGE_MAP() 

CType850LibApp::CType850LibApp() 
{ 
} 

CType850LibApp theApp; 


BOOL CType850LibApp::InitInstance() 
{ 
    CWinApp::InitInstance(); 

    CSelDlg dlg; 
    m_pMainWnd = &dlg; 
    INT_PTR nResponse = dlg.DoModal(); 

    return FALSE; 
} 


extern "C" __declspec(dllexport)int TYPE850(double &time,double xin[], double xout[], double &t, double &dtdt,double par[],int info[], int icntrl) 

{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
//DLL code ... 
return 1; 
} 

Я добавил экземпляр диалога для CType850LibApp :: InitInstance() только для тестирования. Код может быть скомпилирован, и при запуске основного приложения диалог появляется при вызове DLL. Но очевидная проблема заключается в том, что функция C никогда не вызывается. Идея заключалась в вызове функции C внутри CType850LibApp :: InitInstance(), но это не работает, потому что список параметров функции неизвестен.

Итак, вопросы: 1) Как я могу вызвать функцию C с правильным списком параметров, чтобы вся информация, содержащаяся в списке параметров, была правильно перенесена в DLL-код, и результаты могут быть правильно записаны в xout [] массив? 2) Как только я могу вызвать функцию C, как я могу создать диалоговое окно в DLL?

Благодарим за помощь!

+0

Получите модальное диалоговое окно из 'InitInstance', поместите его в' TYPE850 (...) ' –

+0

Не помогает, потому что Type850() никогда не вызывается. – MrModest

+0

Также убедитесь, что 'InitInstance' возвращает' TRUE'. Это простой вызов функции. Измените свой вопрос, чтобы показать свою вторую попытку и показать соответствующее сообщение об ошибке. –

ответ

0

Извините за поздний ответ. Я думаю, что нашел свою ошибку или, по крайней мере, источник моей путаницы.

Мое предположение было то, что мне нужна эта строка кода для того, чтобы показать диалог:

m_pMainWnd = &dlg; 

это работает только если я создаю и создать экземпляр App-класс

CType850LibApp::CType850LibApp() 
{ 
} 

CType850LibApp theApp; 

, потому что мое понимание что m_pMainWnd является переменной-членом CType850LibApp. Однако, как только «theApp» является intantiated это НЕ

extern "C" __declspec(dllimport) int TYPE850() 

, который выполняется, когда DLL вызывается, но это theApp вместо этого. В этом случае функция TYPE850() полностью игнорируется!

Так решение не использовать приложение-класс, чтобы оставить из линии

m_pMainWnd = &dlg; 

и разместить

CPartDlg PartDlg; 
INT_PTR nResponse = PartDlg.DoModal(); 

в функции TYPE850(). Затем все работает по своему желанию.

Надеюсь, это понятно! Спасибо за помощь!

Смежные вопросы