Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo

1、新建Dll工程

2、Dll工程全部代码

library SubMain;{ Important note about DLL memory management: ShareMem must be thefirst unit in your library's USES clause AND your project's (selectProject-View Source) USES clause if your DLL exports any procedures orfunctions that pass strings as parameters or function results. Thisapplies to all strings passed to and from your DLL--even those thatare nested in records and classes. ShareMem is the interface unit tothe BORLNDMM.DLL shared memory manager, which must be deployed alongwith your DLL. To avoid using BORLNDMM.DLL, pass string informationusing PChar or ShortString parameters. }usesSysUtils, Forms,Classes, Windows, Dialogs,SubMain_Unit in 'SubMain_Unit.pas' {Frm_SubMain};varAppHnd: Thandle;//应用程序的句柄变量AppScr: TScreen;//应用程序的环境变量
{$R *.res}procedure DllEntryPoint(dwReason: DWord);
begincase dwReason ofDLL_PROCESS_ATTACH:beginAppHnd := Application.Handle;//备份Exe句柄AppScr := Screen;//备份Exe环境end;DLL_THREAD_ATTACH: ShowMessage('Create Thread'); //Dll文件中最好用Messagebox,ShowMessage部分环境中容易抽风DLL_THREAD_DETACH: ShowMessage('Free Thread'); //Dll文件中最好用Messagebox,ShowMessage部分环境中容易抽风 DLL_PROCESS_DETACH:beginif Frm_SubMain <> nil then FreeAndNil(Frm_SubMain);//防止Dll窗体未释放干净Application.Handle := AppHnd;      //恢复Exe句柄Screen := AppScr;//恢复Exe环境end;end;
end;exportsCreateFrm,DropFrm;//输出函数接口beginDllProc := @DllEntryPoint;DllEntryPoint(DLL_PROCESS_ATTACH);
end.

3、SubMain_Unit.pas源码

unit SubMain_Unit;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, FyFun_Unit;typeTFrm_SubMain = class(TForm)procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure FormDestroy(Sender: TObject);private{ Private declarations }public{ Public declarations }end;procedure CreateFrm(AppHnd: THandle);export;stdcall;//接口函数声明procedure DropFrm; export;stdcall;//接口函数声明
varFrm_SubMain: TFrm_SubMain;implementation{$R *.dfm}
procedure CreateFrm(AppHnd: THandle);//窗体创建函数
beginApplication.Handle := AppHnd;if not Assigned(Frm_SubMain) thenFrm_SubMain := TFrm_SubMain.Create(Application);Frm_SubMain.Show;
end;procedure DropFrm;//窗体释放函数
beginif Frm_SubMain <> nil thenFreeAndNil(Frm_SubMain);
end;
procedure TFrm_SubMain.FormClose(Sender: TObject; var Action: TCloseAction);
beginAction := caFree;//dll窗体关闭自动释放
end;procedure TFrm_SubMain.FormDestroy(Sender: TObject);
beginFrm_SubMain := nil;//dll窗体关闭自动释放
end;end.
4、调用文件Main.pas代码

unit Main_Unit;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTCreateFrm = procedure(AppHnd: THandle); stdcall;TDropFrm = procedure; stdcall;TFrm_Main = class(TForm)Btn_1: TButton;Btn_2: TButton;Btn_3: TButton;Btn_4: TButton;procedure Btn_1Click(Sender: TObject);procedure Btn_2Click(Sender: TObject);procedure Btn_3Click(Sender: TObject);procedure Btn_4Click(Sender: TObject);privateLibHandle: THandle;FormRef: LongInt;{ Private declarations }public{ Public declarations }end;varFrm_Main: TFrm_Main;implementation{$R *.dfm}procedure TFrm_Main.Btn_1Click(Sender: TObject);		//动态加载Dll文件
beginif LibHandle = 0 thenbeginLibHandle := SafeLoadLibrary('SubMain.dll');if LibHandle = 0 thenraise Exception.Create('Not Found Dll File')elseShowMessage('Dll Loaded');end;
end;procedure TFrm_Main.Btn_2Click(Sender: TObject);		//释放Dll文件
beginif LibHandle > 0 thenbeginFreeLibrary(LibHandle);LibHandle := 0;ShowMessage('Dll UnLoaded');end;
end;procedure TFrm_Main.Btn_3Click(Sender: TObject);		//读取Dll文件窗体并显示
varCreateFrm: TCreateFrm;
beginif LibHandle = 0 thenraise Exception.Create('Place Load Dll File First');@CreateFrm := GetProcAddress(LibHandle,PChar('CreateFrm'));if @CreateFrm = nil thenraise Exception.Create('Function Error');CreateFrm(Application.Handle);
end;procedure TFrm_Main.Btn_4Click(Sender: TObject);		//释放Dll窗体
varDropFrm: TDropFrm;
begin@DropFrm := GetProcAddress(LibHandle,PChar('DropFrm'));if @DropFrm = nil thenraise Exception.Create('Function Error');DropFrm;
end;end.



转载于:https://www.cnblogs.com/jupt/p/3922938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java擦除

概述&#xff1a; Java泛型在使用过程有诸多的问题&#xff0c;如不存在List<String>.class, List<Integer>不能赋值给List<Number>&#xff08;不可协变&#xff09;&#xff0c;奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了解Java的一些概…

mysql数据库相互备份_MySQL的本地备份和双机相互备份脚本

先修改脚本进行必要的配置,然后以root用户执行.1. 第一执行远程备份时先用 first参数.2. 本地备份用local参数3. 远程备份不用参数注意:需要在另一主机上的Mysql用户用添加用户..需要配置的地方:# define host and mysql passwordREMOTE_HOST"" #远程主机名或IPREMOT…

Spring Boot和Swagger UI

我已经一年没有从头开始开发Spring Web应用程序了&#xff0c;如果我不参加QA自动化工程师的培训&#xff0c;那么这段时间甚至会更长。 由于这个原因&#xff0c;我开发了一个示例REST应用程序。 除了Swagger&#xff0c;一切对我来说都很熟悉。 因此&#xff0c;我将描述我在…

mysql5.7.22打不开_windows下mysql-5.7.22-winx64突然启动不了,报错Could not open log file

本文摘自classinstance.cn。windows下mysql-5.7.22-winx64突然启动不了&#xff0c;感觉启动几秒钟后就自己关闭了&#xff0c;看了下启动日志&#xff1a;2019-08-25T10:57:08.389404Z 0 [Warning] option wait_timeout: unsigned value 31536000 adjusted to 21474832019-08-…

HDU1530 最大流问题

第一次写Dinic 然后贴一下 最基础的网络流问题 嘎嘎: #include <iostream> #include<cstdio> #include<string.h> #include<queue> using namespace std; const int M205; __int64 map[M][M]; int n,m,dist[M]; queue<int>q; void readdate() {_…

把python37添加到环境变量配置_关于在win 10上成功创建一个Django项目时遇到django-admin的手动配置环境变量问题。...

前言初学Python Web 在创建第一个Djang项目的时候出现了很多的问题&#xff0c;今天和大家分享并记录一下这次艰难的历程&#xff01;一、官网下载Python以及安装Django1、Python的下载安装链接&#xff1a;大家最好使用谷歌浏览器&#xff0c;因为翻译的很到位(大家下载最新版…

在Ant中显示路径

在博客文章Java and Ant Properties Refresher和Ant <echoproperties /> Task中 &#xff0c;我写了一篇关于如何了解Ant构建如何看到属性的文章&#xff0c;这有助于更好地理解构建。 通常情况下&#xff0c;在构建过程中看到构建中使用的各种路径也很有价值&#xff0c…

如何删除数据库中的所有用户表(表与表之间有外键关系)

1、由表名求字段名 create proc up_008(table varchar(20)) as begin declare sql varchar(99) select sql\select name from syscolumns where idobject_id(\ select sqlsql\\\\table\\\\\)\ --select sql exec(SQL) end exec up_008 a_idx2 2、编程删…

Azure开发者任务之一:解决Azure Storage Emulator初始化失败

初学Windows Azure&#xff1a; 我打算开始学习Windows Azure。我安装了Azure SDK&#xff0c;然后在“Cloud”标签下选择Windows Azure模板&#xff0c;创建了一个项目&#xff0c;然后又创建了一个Web角色。 在aspx文件上&#xff0c;我只添加了一个标签&#xff0c;但是当我…

关于Java里如何跳出一个多重循环

一般我们要跳出一个循环&#xff0c;用break就OK了&#xff0c;比如&#xff1a; 1 for(int i1;i<5;i){ 2   if&#xff08;条件&#xff09; 3     break&#xff1b; 4   //一些代码 5 } 但是如果这时候&#xff0c;在这一层循环外面还有一层循环的话&#…

CCRC认证对企业的作用?

CCRC认证&#xff08;中国网络安全审查认证&#xff09;是针对网络产品和服务的安全审查制度&#xff0c;它对企业的作用主要体现在以下几个方面&#xff1a; 1. 提升产品安全性 CCRC认证要求企业对其网络产品和服务进行全面的安全审查&#xff0c;确保符合国家网络安全标准和…

java运行python3_python写脚本并用java调用python(三)

1)编写mytest.py完成一个简单加法计算# coding:utf8#def 表示一个方法 adderdef adder(a, b):return ab#这里执行adder方法并打印出结果print adder(1,2)2)运行以上脚本方式如图12 3 打印成功&#xff01;3)java调用python脚本的两种方式Process process Runtime.getRuntime(…

Hibernate教程– ULTIMATE指南(PDF下载)

编者注&#xff1a;在本文中&#xff0c;我们提供了全面的Hibernate教程。 Hibernate ORM&#xff08;简称Hibernate&#xff09;是一个对象关系映射框架&#xff0c;它有助于将面向对象的域模型转换为传统的关系数据库。 Hibernate通过用高级对象处理功能代替直接与持久性相关…

mysql单源多表同步单库单表_MySQL主从复制单表或者多表

MySQL数据库安装不过多的介绍了&#xff1a;必须保证2个数据库的版本一致。 主数据库&#xff1a;192.168.0.43 从数据库&#xff1a;192.168.0.53 修改43主数据MySQL数据库安装不过多的介绍了&#xff1a;必须保证2个数据库的版本一致。主数据库&#xff1a;192.168.0.43从数据…

悲观锁定时如何避免可怕的死锁-以及Java 8的一些用法!

有时您根本无法避免&#xff1a;通过SQL进行悲观锁定。 实际上&#xff0c;当您要在共享的全局锁上同步多个应用程序时&#xff0c;它是一个很棒的工具。 有些人可能认为这是在滥用数据库。 如果可以解决您遇到的问题&#xff0c;我们认为可以使用您拥有的工具。 例如&#xf…

object - c 函数的值

函数名说明int rand()随机数生成。&#xff08;例&#xff09;srand(time(nil)); //随机数初期化int val rand()%50; //0&#xff5e;49之间的随机数int abs(int a)整数的绝对值&#xff08;例&#xff09;int val abs(-8); →8※浮点数的时候用fabs。double fabs(double …

xshell 秘钥连接_如何使用PuTTY和xshell 分别远程连接linux,并配置秘钥认证

使用PuTTY 连接并配置密钥认证第一步&#xff1a;下载PuTTY下载 .zip 64位的电脑 32位的putty也能用第二步&#xff1a;配置基本信息打开 PuTTY端口默认是22 (端口是可以改的)ip 地址如果忘记&#xff0c;ifconfig 查看一下Load >Open输入登录名 密码即可完成登录若出现上…

滨河新区(黄河楼)夜景

转载于:https://www.cnblogs.com/ysx4221/p/3454517.html

使用Junit测试名称

命名测试 在创建Junit测试时&#xff0c;通常没有实际使用该方法的名称。 Junit运行程序使用反射来发现测试方法&#xff0c;并且从版本4开始&#xff0c;您不再被限制以test开始方法的名称。 测试方法的名称用于文档目的。 人们遵循不同的风格。 您可以使用给定的given_Somet…

java 门面模式_Java门面模式

一、简介隐藏系统的复杂性&#xff0c;对外提供统一的访问入口&#xff0c;外部系统访问只通过此暴露出的统一接口访问。是一种结构型模式。封装子系统接口的复杂性&#xff0c;提供统一的对外接口&#xff0c;能够使子系统更加简单的被使用。二、结构及使用场景如上所示&#…