2016-08-10 99 views
0

我写一个DLL(MS VS13,C++),其是由一个外部程序调用和其使用的标准化参数列表:MFC对话框在非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函数从未被调用过。这个想法是在CType850LibApp :: InitInstance()中调用C函数,但是这不起作用,因为函数的参数列表是未知的。

所以问题是: 1)如何使用正确的参数列表调用C函数,以便将参数列表中包含的所有信息正确传输到DLL代码,并且结果可以正确写入xout []数组? 2)一旦我可以调用C函数,我如何实例化DLL中的对话框?

感谢您的帮助!

+0

从'InitInstance'中取出模态对话框,放入'TYPE850(...)' –

+0

没有帮助,因为Type850()永远不会被调用。 – MrModest

+0

还要确保'InitInstance'返回'TRUE'。这是一个简单的函数调用。编辑您的问题以显示您的第二次尝试并显示相关的错误消息。 –

回答

0

对不起,我的迟到回应。我想我发现了我的错误,或者至少是我的困惑的来源。

我的假设是,我需要这行代码,以显示该对话框:

m_pMainWnd = &dlg; 

这只能如果我创建并实例应用级

CType850LibApp::CType850LibApp() 
{ 
} 

CType850LibApp theApp; 

,因为我的理解是m_pMainWnd是CType850LibApp的成员变量。但是,一旦“theApp”被插入,它不是

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

它是在调用dll时执行的,但是它是应用程序。在这种情况下TYPE850()函数完全被忽略!

因此,解决办法是,不使用的应用程序级的,离开了线

m_pMainWnd = &dlg; 

并把

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

的TYPE850()函数中。然后一切按需要运作。

希望这是可以理解的! 感谢您的帮助!