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

时间:2012-08-30 06:46:39

标签: wpf vb.net mfc pinvoke showdialog

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

TestDialog.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()
};

TestDialog.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();方法时,会出现上述错误。

1 个答案:

答案 0 :(得分:2)

这应该可行 -

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

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