2012-08-30 59 views
2

我在.dll项目中创建了对话框。现在我想通过点击按钮从WPF应用程序打开该对话框。以下是对话的代码:它通过调用创建对话的对象,然后打开该对话框如何从WPF应用程序打开MFC对话框?

#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() 

我已经创建了导出功能:

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 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();点击button.It会抛出异常我作为

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();方法上面的错误来了。

回答

2

这应该工作 -

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

当建立一个规则DLL动态链接到MFC,则需要使用宏AFX_MANAGE_STATE正确切换MFC模块状态。

+0

+1:这就是答案。 – ceztko

相关问题