非MFC应用程序中的MFC对话框

时间:2016-08-10 15:48:54

标签: dll mfc

我正在编写一个由外部程序调用并使用标准化参数列表的DLL(MS VS13,c ++):

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代码。然后代码看起来像这样(没有include语句):

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中实例化对话框?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

很抱歉我的回复很晚。我想我发现了自己的错误或至少是我混淆的根源。

我的假设是我需要这行代码才能显示对话框:

 m_pMainWnd = &dlg;

这仅在我创建并实例化app-class

时才有效
CType850LibApp::CType850LibApp()
{
}

CType850LibApp theApp;

因为我的理解是m_pMainWnd是CType850LibApp的成员变量。但是,一旦" theApp"被证实它不是

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

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

因此解决方案是,不要使用app-class来省略行

m_pMainWnd = &dlg;

并放置

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

在TYPE850()函数中。然后一切都按预期工作。

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