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

Posted

技术标签:

【中文标题】非 MFC 应用程序中的 MFC 对话框【英文标题】:MFC Dialog in non-MFC application 【发布时间】:2016-08-10 15:48:54 【问题描述】:

我正在编写一个由外部程序调用并使用标准化参数列表的 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 代码。然后代码看起来像这样(没有包含语句):

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

感谢您的帮助!

【问题讨论】:

InitInstance中取出模态对话框,放入TYPE850(...) 没有帮助,因为从未调用过 Type850()。 还要确保InitInstance 正在返回TRUE。这是一个简单的函数调用。编辑您的问题以显示您的第二次尝试并显示相关的错误消息。 不太明白您要做什么。可执行文件应加载(静态或动态)DLL 并调用“导出”函数(在您的情况下为 TYPE850() )。在该函数中,您可以显示对话框,并调用原始 DLL 代码。在 App 对象的 InitInstance() 中执行此操作没有意义(我猜是在 DLL 加载期间调用的?)。可以使用成员变量和 DDX/DDV 功能将参数传递/检索到对话框,或者如果您不想这样做,可以将它们复制到全局变量。 【参考方案1】:

抱歉我的回复晚了。我想我找到了自己的错误,或者至少是我困惑的根源。

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

 m_pMainWnd = &dlg;

这仅在我创建和实例化应用程序类时才有效

CType850LibApp::CType850LibApp()



CType850LibApp theApp;

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

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

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

所以解决方案是,不使用应用程序类,省去这条线

m_pMainWnd = &dlg;

并放置

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

在 TYPE850() 函数中。然后一切正常。

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

【讨论】:

以上是关于非 MFC 应用程序中的 MFC 对话框的主要内容,如果未能解决你的问题,请参考以下文章

非 MFC ATL 项目 (dll) 产生 MFC 相关错误

用于非 MFC 应用程序的 Visual Studio 2012 资源编辑器

mfc非模态对话框

MFC——对话框,模态对话框

如何创建一个模态的对话框

VS2017 MFC应用中添加模态对话框时为其添加类弹出如下错误