wpf - 如何从 WPF 应用程序打开 MFC 对话框?

标签 wpf vb.net mfc pinvoke showdialog

我在.dll 项目中创建了对话框。现在我想通过单击按钮从 WPF 应用程序打开该对话框。以下是对话框的代码:

测试对话框.h:

class CTestDialog : public CDialogEx
{
    DECLARE_DYNAMIC(CTestDialog)

public:
    CTestDialog(CWnd* pParent = NULL);   // standard constructor
    virtual ~CTestDialog();

// Dialog Data
    enum { IDD = 1000 };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP()
};

测试对话框.cpp:

#include "stdafx.h"
#include "MFCDll.h"
#include "TestDialog.h"
#include "afxdialogex.h"

IMPLEMENT_DYNAMIC(CTestDialog, CDialogEx)

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
    : CDialogEx(CTestDialog::IDD, pParent)
{
}

CTestDialog::~CTestDialog()
{
}

void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTestDialog, CDialogEx)
END_MESSAGE_MAP()

我创建了导出函数,它创建对话框对象并通过调用 DoModel() 函数打开该对话框。

extern "C" void PASCAL EXPORT ShowDialogFromDLL()
{
    CTestDialog dlg;
    theApp.m_pMainWnd = &dlg;
    dlg.DoModal();
}

之后,我从 WPF 表单调用此导出函数,以下是 WPF 表单的代码。

MainWindow.xaml.vb:

namespace MainApp
{
    public partial class MainWindow : Window
    {
        [DllImport("MFCDll.dll", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern void ShowDialogFromDLL();
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnShow_Click(object sender, RoutedEventArgs e)
        {
            ShowDialogFromDLL();
        }
    }
}

但是现在当我调用 ShowDialogFromDLL(); 时单击按钮后。它会引发异常

Microsoft Visual C++ Debug Library
Debug Assertion Failed!

Program: E:\EDR1\Test\MainApp\bin\Debug\MainApp.vshost.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

当我调用dlg.DoModal();方法时出现上述错误。

最佳答案

这应该有效 -

extern "C" __declspec(dllexport) void __stdcall ShowDialogFromDLL()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    CTestDialog dlg;
    dlg.DoModal();
}

当构建动态链接到MFC的常规DLL时,需要使用宏AFX_MANAGE_STATE正确切换MFC模块状态。

关于wpf - 如何从 WPF 应用程序打开 MFC 对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12191300/

相关文章:

.net - 如何在资源字典中正确定义颜色?

c# - WPF- 将 TextBlock 绑定(bind)到按钮

asp.net - 如何使用VB在单个按钮单击事件上打印整个asp.net网页?

.net - 更新面板复制了我的控件

vb.net - 用于自动添加事件委托(delegate)方法的 Visual Studio 快捷方式

c++ - 将 WIC 位图绘制到窗口?

wpf - 清除文本框不会将绑定(bind)设置为 null

wpf - SelectedItem、SelectedValue 和 SelectedValuePath 之间的区别

c++ - 我可以依靠TCHAR的定义对我使用的字符集做出正确的假设吗?

c++ - 我如何(安全地)中断单独线程上的计算?