将 VC/QT 窗体 EXE 转换成 DLL,供其它语言调用

11 篇文章 3 订阅
5 篇文章 0 订阅

在网上也搜索了一番,但都太麻烦,或者不太实用。只好自己摸索了。终于搞定。记录一下。

宗旨:
         一:尽量不修改原有 VC EXE 工程的源代码;
         二:尽量具有通用性;

VC 的窗体有两种:基于对话框(Dialog)的窗体(QT窗体和这个是类似的)基于 MFC 的窗体。下面分情况说明。

一:基于对话框(Dialog)的窗体(QT窗体)
       基于对话框(Dialog)的窗体,因为没有封装,所以程序的入口点是 WinMain(QT 窗体可能是 WinMain,也可能是 main)
       所以我们新建一个dll.cpp 文件,输出函数 ShowDllForm,ShowDllForm 函数调用 WinMain,就可以了。
       不用修改原有工程的源代码。
       将这个dll.cpp 编译(只编译,不连接),再和原有的 EXE 工程编译出来的 OBJ、RES、库文件,一起连接成 DLL 就可以了。
      

#include <windows.h>

HINSTANCE hinst = NULL;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
		hinst = (HINSTANCE)hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow);

extern "C" __declspec(dllexport) void ShowDllForm()
{
      WinMain(hinst, 0, (LPSTR)"", 1);
}

二:基于 MFC 的窗体
MFC 是经过微软封装的。和基于对话框的 EXE 有区别。
MFC EXE/DLL 程序的入口被封装了,不在我们的工程代码中。
而是调用我们工程中的  CxxxApp::InitInstance() 代码。
因此从这个函数入手。
1、将 MFC EXE 工程修改为 DLL 类型;
2、修改 CxxxApp::InitInstance 里面的内容。因为 DLL 一初始化,就会调用这里的代码。
      在行首(最前面),添加代码:
      (g_bInit 为新添加的 bool 类型变量。意思很明确,为 false 时,不执行后面的代码,直接返回了)

BOOL CxxxApp::InitInstance()
{
    if(!g_bInit)
	  return TRUE;

3、在此单元,CxxxApp::InitInstance 代码上面,添加 DLL 输出函数 ShowDllForm,再次调用 InitInstance() 函数:

BOOL g_bInit=FALSE;

extern "C" __declspec(dllexport) void ShowDllForm()
{
	g_bInit = TRUE;
	theApp.InitInstance();
}

  编译,得到 DLL ,调用OK。

QT 窗体EXE封装成DLL,和 VC 的基于对话框是一样的。
 

实例:
    基于对话框:
    7zip            https://github.com/dbyoung720/PB/tree/master/modules/7-zip
    Notepad 2  https://github.com/dbyoung720/PB/tree/master/modules/Notepad2

   MFC 窗体:
   mpc-be        https://github.com/dbyoung720/PB/tree/master/modules/mpc-be

   QT 窗体:
   CMake-gui   https://github.com/dbyoung720/PB/tree/master/modules/cmake-gui
   qBittorent     https://github.com/dbyoung720/PB/tree/master/modules/qBittorrent
 

GOOD LUCK!

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值