【问题标题】:Calling MFC Dialog from C# .Net?从 C# .Net 调用 MFC 对话框?
【发布时间】:2014-10-10 03:22:21
【问题描述】:

我需要将遗留 MFC 代码集成到我的 C# .Net 应用程序中。

为了简化集成,为了模拟我的 MFC 代码,我创建了一个示例 MFC Dialog 应用程序,带有一个按钮和一个编辑框。当我单击按钮时,它将 Hello World 写入编辑框。

我的目标是从我的 .Net 应用程序中调用它。如果我的 .Net 应用程序可以弹出对话框,并在我单击按钮时让它打印 HelloWorld,我会很高兴。我听说 C++/CLI 是执行此操作的好方法。如果动态链接使问题复杂化,我也可以使用静态链接。

首先,我想知道这是否可能?我不明白完成此操作所需的过程。

到目前为止:我从项目属性中启用了 CLR 支持,并创建了一个 C# WinForms 应用程序。我能够添加 MFC Dialog 应用程序作为对 C# WInforms 应用程序的引用。但我一直在寻找如何跨界面导出对话框。因为,我在做静态链接,我还需要为对话框类编写 dllexports 吗?如何导出所有对话框类,C# 将如何找到描述 GUI 如何为对话框布局的资源文件?

对话框的代码是 App Wizard 生成的,我只是添加了一个编辑框和一个按钮,并为将 HelloWorld 写入编辑框的按钮添加了一个处理程序。


首先,我尝试创建另一个 MFC 应用程序,看看是否至少可以从另一个 MFC 应用程序调用我的 MFC 对话框。在消费者应用程序中,我添加了我的 Hello World Dialog 应用程序作为参考,并包含了 Dialog 头文件的路径。但它给了我一个错误,说 IDD_DLG,即我的对话的 ID 是无法识别的。所以,我需要弄清楚如何提供资源文件,其中定义了所有 ID。

【问题讨论】:

    标签: c# .net mfc c++-cli interop


    【解决方案1】:

    MFC 方法不能直接 P/Invoked(参见this SO Answer),我从另一个程序调用对话框的方法是创建一个包含对话框的 DLL,导出一个可以调用对话框的函数,然后从外部应用程序(例如:C#)调用 DLL 函数:

    #include "stdafx.h"
    #include "afxdialogex.h"
    #include "MyDlg.h"
    
    extern "C" __declspec (dllexport) BOOL ShowDlg()
    {   AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
        CMyDlg dlg;
        INT_PTR nResponse = dlg.DoModal();
        return (nResponse == IDOK);
    }
    

    您还可以根据需要添加参数以传递到对话框或从对话框传递...

    【讨论】:

      【解决方案2】:

      这里的关键字是COM 互操作性:构建一个 COM 服务器(即 ActiveX 控件)以从托管代码调用非托管代码。在我看来,这是最好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多