从c# . net调用MFC对话框
本文关键字:MFC 对话框 调用 net | 更新日期: 2023-09-27 18:18:11
我需要将遗留的MFC代码集成到我的c# . net应用程序中。
为了模拟我的MFC代码以简化集成,我创建了一个示例MFC Dialog应用程序,其中包含一个按钮和一个编辑框。当我单击该按钮时,它将Hello World写入编辑框。我的目标是使它可以从我的。net应用程序中调用。如果我的。net应用程序可以弹出对话框,并在我单击按钮时打印HelloWorld,我会很高兴。我听说c++/CLI是一个很好的方法。如果动态链接使问题复杂化,我也可以使用静态链接。首先,我想知道这是否可能?我不明白完成这一任务所需的过程。
到目前为止:我从项目属性中启用了CLR支持,并创建了一个c# WinForms应用程序。我能够添加MFC对话框应用程序作为c# WInforms应用程序的参考。但我一直在寻找如何跨界面导出对话框。既然我在做静态链接,我还需要为对话框类写dllexports吗?我如何导出所有的对话框类,c#如何找到描述如何为对话框布局GUI的资源文件?对话框的代码是App Wizard生成的,我只是添加了一个编辑框和一个按钮,并为按钮添加了一个处理程序,该按钮将HelloWorld写入编辑框。
为了开始,我尝试创建另一个MFC应用程序,看看我是否至少可以从另一个MFC应用程序调用我的MFC对话框。在消费者应用程序中,我添加了Hello World Dialog应用程序作为引用,并包含了Dialog头文件的路径。但它给了我一个错误,说IDD_DLG,这是我的对话框的ID是未知的。因此,我需要弄清楚如何提供资源文件,其中定义了所有id。
MFC方法不能直接被p/调用(参见这个SO答案),我从另一个程序调用对话框所做的是创建一个包含对话框的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);
}
您还可以根据需要在对话框中添加参数…
这里的关键字是COM互操作性:构建一个COM服务器(即ActiveX控件)从托管代码调用非托管代码。在我看来,这是最好的办法。