QT调用动态库,执行MFC窗口功能

QT和MFC使用的不同框架,提供不同的接口,以前MFC已经完善部分功能,且已封装为库,代码还多,不想全部用QT重写,于是想用QT调用动态库,执行MFC部分功能

1.导出函数

#pragma once

#ifdef MyDll_EXPORTS
#define _MyDll_API __declspec(dllexport)

#include 
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

#else
#define _MyDll_API //__declspec(dllimport)
#define HWND void* //专门给qt准备的,windows中有WIN32宏,懒得写
#endif


class _MyDll_API hqMfcFunc {
public:
	hqMfcFunc();
	~hqMfcFunc();

	int initLocalCanvas(HWND hMsgWnd, HWND *hChild);
	int insertMfcMessageData(char* data, int dataSize);
};


extern "C"
{
	int _MyDll_API testadd(int a, int b);
	int _MyDll_API initLocalCanvasForQt();//主要使用这个
}

2.qt使用动态库

pro文件中


LIBS += \
    E:/QTProject/super/MyDll.lib \
    -lWs2_32

正常引用头文件,动态库放编译后程序相同目录

 

问题:

1、调用的时候domodal会卡住,而我有想你mfc窗口domodal,

于是使用qt线程调用接口

2、关闭窗口的时候,qt程序跟着一起退出了,以为是调用约定的问题__stdcall、_cdcel之类的,但是我写了一个最简单的testadd测试函数,qt程序正常,正常返回。于是我把mfc中的逻辑全部注释,只弹出一个窗口,这种情况下没问题,一点点加入逻辑,发现是释放资源的问题。

因为重载了CStatic,实现一个自己的图片显示控件,在析构函数中

DeleteObject(m_pBkBitmap);

delete m_pBkBitmap;

m_pBkBitmap = NULL;

发现是这里的问题,但是其他地方也有是放过资源就没问题,C#调用过这个库也没问题,于是既然跟资源有关,就把释放资源这个步骤放到OnDestroy的逻辑中去,问题解决了。

你可能感兴趣的:(qt,mfc)