一、由来:
1、每次开发一个新项目,都需要编写主界面,又要考虑各个子模块。重复造轮子。
2、写代码也好些年了。自己也写了很多小工具。分布在各个地方。需要使用的时候,到处找。十分不方便。
想着能不能将这些小工具都统一放在一起,变成一个个 Dll,在主窗体中调用这些由 EXE 修改而来的 Dll。
将这些 EXE 源代码工程修改为 Dll 工程时,尽可能的少修改,或不修改源代码(包括 Delphi、VC、QT)。
二、开发步骤(包括 Delphi 、VC、QT):
Delphi:
1、原有的 EXE 工程:修改为 Dll 工程,并添加输出函数(见2、标准的 DLL 工程);
2、标准的 DLL 工程:
输出一个函数:
procedure db_ShowDllForm_Plugins(var frm: TFormClass; var strParentModuleName, strSubModuleName: PAnsiChar); stdcall;
参数说明:
frm :Delphi 专用。 Delphi 中 DLL 主窗体类名;VC 置空;
strParentModuleName :父模块名称;
strSubModuleName :子模块名称;
即你的这个 Dll 模块是干什么的。例如人员管理--->考勤管理,这里人员管理就是父模块名称,考勤管理就是子模块名称。
示例:Module\SysSPath
procedure db_ShowDllForm_Plugins(var frm: TFormClass; var strParentModuleName, strModuleName: PAnsiChar); stdcall;
begin
frm := TfrmSysSearch;
strParentModuleName := '系统管理';
strModuleName := '系统搜索路径';
Application.Handle := GetMainFormApplication.Handle;
Application.Icon.Handle := GetMainFormApplication.Icon.Handle;
end;
5行代码就可以了。原有的源代码不用做任何修改。
VC2022/QT:
#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;
}
enum TVCDllType {vtDialog, vtMFC};
extern int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow);
extern "C" __declspec(dllexport) void db_ShowDllForm_Plugins(TVCDllType* spFileType, char** strParentName, char** strSubModuleName, char** strClassName, char** strWindowName, const bool show = false)
{
* spFileType = vtDialog; // TVCDllType
* strParentName = "文件管理"; // 父模块名称
* strSubModuleName = "Notepad2"; // 子模块名称
* strClassName = "Notepad2U"; // 窗体类名
* strWindowName = "Notepad2"; // 窗体名
if (show)
{
WinMain(hinst, 0, (LPSTR)"", (int)show);
}
}
( const bool show,第一次调用 VC 的此函数时,需要获取到前面的参数,并不需要创建窗体)
( WinMain函数是你原有 VC EXE 的入口)
VC 原工程保持不变,编译得到 EXE。 新建类似上面的 .CPP 文件,编译,和原来的编译 EXE 产生的 OBJ 文件,进行连接,得到 DLL 文件,放置到 plugins 目录下就可以了。
示例1:DOC\VC\Dialog\7zip
示例2:DOC\VC\Dialog\Notepad2
三:特色功能
界面支持,菜单方式显示、按钮(对话框)方式显示、列表视方式显示。
PBox 还支持将一个 EXE 显示在窗体中。x86可以执行x64 EXE, X64 可以执行X86 EXE.妙哉妙哉!
四、未来打算:
1、加入远程控制功能;
2、加入数据库功能;
3、加入聊天功能;
五:更新日志:
2019-04-30:添加 VC 窗体 Dll (示例:文件管理--->Notepad2<GitHub - XhmikosR/notepad2-mod: LOOKING FOR DEVELOPERS - Notepad2-mod, a Notepad2 fork, a fast and light-weight Notepad-like text editor with syntax highlighting>)。
2019-05-24:添加 VC 窗体 Dll (示例:文件管理--->7-Zip <Download>)。
六、开源地址:
GitHub - dbyoung720/PB: PB(PBox) is a modular development platform based on DLL Window
七:效果图:
---------------------------------------------------------------------------------------------------------------------------------
开发语言:
Delphi11.3 + WIN10X64
开发作者:
dbyoung@sina.com
QQ群:101611228
开发时间:
2018-06-01