Qt 프로그램에서 MFC 동적 라이브러리 호출

1. Qt 라이브러리는 MFC 모듈 대화 상자를 호출합니다.

  1. QT에 의해 호출되는 모달 대화 상자는 내보내기 기능 시작 부분에 추가해야 하는 리소스 클래스에 속합니다.AFX_MANAGE_STATE(AfxGetStaticModuleState());
  2. MFC EXE 파일에서 전송된 Dll의 경우 앱 클래스의 초기화 함수가 모달 대화 상자의 해당 코드를 호출하여 TRUE를 반환함을 유의해야 한다.
  1. 마법사를 사용하여 MFCLibrary1이라는 이름의 MFC 동적 라이브러리를 추가합니다.
  2. 대화 리소스를 추가하고 대화 디자인 인터페이스에 CTestDialog와 같은 MFC 인터페이스 클래스를 추가합니다.
class CTestDialog : public CDialogEx
{
    
    
	DECLARE_DYNAMIC(CTestDialog)

public:
	CTestDialog(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CTestDialog();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum {
    
     IDD = IDD_DIALOG1 };
#endif

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

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
};
  1. 내보내기 클래스 추가(엔지니어링 프로젝트에서 해당 내보내기 매크로 정의 TEST_EX 추가)
//
#pragma once
#ifdef TEST_EX
#define TEST_SDK __declspec(dllexport)
#else
#define TEST_SDK __declspec(dllimport)
#endif
class TEST_SDK TestExport
{
    
    
public:
	void showDialog()
    {
    
    
        //下面这句号一定加,否则QT调用会报(afxwin1.inl 第21行的错误)
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        //启动模态对话框;
        CTestDialog dlg;
        dialog.DoModal();
    }
};


  1. Qt에 전화

일반적인 일반 프로시저 호출과 어떤 식으로든 차이가 없습니다.

QObject::connect(ui.pushButton, &QPushButton::clicked, []()
	{
    
    
		TestExport test;
		test.showDialog();

	});
  1. 업적

이미지.png

둘, Qt 라이브러리 내장 MFC 대화 제어

  1. MFCLibrary1 동적 라이브러리 관련 기능은 기본적으로 유사합니다.
  2. TestExport 클래스에 대화 상자 창 핸들을 가져오는 메서드를 추가합니다.
CTestDialog* dialog = new CTestDialog();

void* TestExport::getDialogHandle()
{
    
    
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

    //将对话框当成控件用;
	dialog->Create(IDD_DIALOG1);

	dialog->ShowWindow(SW_SHOW);
	dialog->DoModal();
	return dialog->GetSafeHwnd();
}
  1. qt 프로그램은 MFC 컨트롤에 액세스합니다.
QObject::connect(ui.pushButton, &QPushButton::clicked, [=]()
	{
    
    
		TestExport test;
		void* handle = test.getDialogHandle();

		if(handle)
		{
    
    
			auto m_window = QWindow::fromWinId((WId)handle);


			m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);

			auto mWidget = QWidget::createWindowContainer(m_window);
			this->setCentralWidget(mWidget);
        }
	});
  1. 업적

이미지.png

추천

출처blog.csdn.net/qq_33377547/article/details/125597346