2

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

4

1 回答 1

2

这应该工作-

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

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

于 2012-10-14T04:31:48.983 回答