2

.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();メソッドを呼び出すと、上記のエラーが発生します。

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 に答える