PBox 基于 Dll 动态库窗体的模块化开发平台 (已开源)

11 篇文章 2 订阅

一、由来:
  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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本版本自己实现Raize控件组中TCheckTree,并将所有与Raize控件相关代码更新,现在的版本不使用任何的第三方组件,DELPHI7下直接编译通过。这里要注意的是系统的初始密码,您如果看代码,在uAuthAppFactory单元,有一个CreateUser方法,在这个方法内部,会首先查找程序目录有没有用户数据文件,如果没有的话,就会初始一个拥有所有操作权限的Administrator用户,密码就是administrator,您只要使用Administrator登录就可以了。uAuthAppFactory单元及其它单元的作用可以参见下面文档的说明。  工程文件位于“Instance”目录,User.dat是用户数据文件,所有的用户组、用户都保存在这个文件里(密码也用的明文保存)。“日志”目录保存所有的目录,每一位用户每次的使用都会有日志记录如果想要下载演示,可以上一次的版本,里面有一个很长时间的演示期待着您的参与DELPHI社群中开源项目少之又少,我们可不可以自己组织?我们可不可以一起探讨?小弟不才,斗胆写下几行代码,来这里期待抛砖引玉。我们身边,每天都有无数的项目开工,然后是老板对进度的紧追不舍,项目经理程序员加班的无奈,再然后或许是成功的喜悦或许是失败的哀愁,但不管结果如何,所有人心中此时最想要的,可能是好好的睡上一觉。这无数的项目,他们有没有共同点?我们是不是一直在做重复发明轮子的蠢事?Delphi让我们搭建一个程序变得容易,我希望通过我们的努力,让我们搭建一个项目更容易,利用我们可以想到的任何办法,不管是框架源代码、模版文档、代码生成工具甚至是我们手把手经验的交流,我们的目标就是让一个项目开发更加的容易、让一个项目成功更加的容易。这样的工作是激动人心的,可是我也和大家一样,面临着手头上项目的压力,为了能够对得起那份薪水,我只能够在下班的时间里做这些。但一个人精力太有限了,uPattern是一个模式实现单元,没有足够的时间也没有那么多精力去实现所有的模式,于是在这份源代码里,您发现您可以使用一个用户组来登录,本来这是不允许的啊,如果您想找到原因,原来uPattern中对于合成模式的实现使用的是原始的透明方式……一个人的力量太有限了,一个人的才智也太有限了,如果这个小生命在我一个人的手里,也许会因为得不到充足的阳光雨露而不能茁壮成长,但是如果有您的加入,多了您的呵护,相信我们的目标才更有可能实现。如果您是高手,那么就在这里表现您的聪明才智吧。如果您是菜鸟,来这里汲取知识吧。所有的源代码都永久性公开,如果您有什么地方不清楚或者是有更好的建议,您也可以直接联系我。――――――――――――――――――――――――――――――――――这是一个应用程序框架,现在已经完成部分框架代码与用户管理、权限管理与日志管理模块。如果您有任何的问题或者是建议可以发邮件到我的邮箱,您可以使用本源代码在您的任何应用之中(包括商业应用)。如果您想要和我们一起来发展壮大这份源代码,请您发邮件给我(Camel_163@163.com),或者是在下面留言。――――――――――――――――――――――――――――――――――    uClasses------------------------------在这里定义应用程序中的基础类    uPattern------------------------------几个模式的DELPHI实现或者定义    uAppUtils-----------------------------应用程序工具单元    uAppSet-------------------------------应用程序设置接口声明单元    uAppSetIniFile------------------------应用程序设置IniFile实现单元    uException----------------------------异常统一处理单元    uAppFactory---------------------------应用程序工厂,本工厂生产出来的就是一个一般的应用程序    uAuthAppFactory-----------------------应用程序工厂,本工厂生产出来的就是拥有权限管理、日志及用户管理的程序 ufrmAppBase---------------------------口基类 ufrmAppDlgBase------------------------对话框口基类    用户、权限与日志管理单元    Role----------------------------------权限与用户管理主要的实现单元    Log-----------------------------------日志管理单元    ufrmRoleManager-----------------------权限管理主用户界面    ufrmLogin-----------------------------用户登录界面    ufrmChangePassword--------------------更改用户密码    ufrmLog-------------------------------日志查看界面 CommandRegister-----------------------模块注册中心

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值