QT和MFC使用的不同框架,提供不同的接口,以前MFC已经完善部分功能,且已封装为库,代码还多,不想全部用QT重写,于是想用QT调用动态库,执行MFC部分功能
1.导出函数
#pragma once
#ifdef MyDll_EXPORTS
#define _MyDll_API __declspec(dllexport)
#include <gdiplus.h>
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的逻辑中去,问题解决了。