Dll学习三_Dll 相互间以及主程序间的数据共享——测试未通过,应该用内存映射
测试环境:XP,DELPHI XE
验证通过结构:主程序+一个Dll窗体
共享方式原理:通过主程序与各Dll定义相同的参数结构体,由主程序实例化该结构体,对于各Dll间的共享,通过传主程序实例化的结构体指针达到各Dll与主程序相互间的数据共享。且Dll释放不影响主程序实例化结构体时获得的内存空间
主程序代码:
unit Main_Unit; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TPara = record
ADOConnStr: String;
end;
TCreateFrm = procedure(AppHnd: THandle; APar: TPara); stdcall; //此处传递主程序实例化后的参数结构体
TCreateSubFrm = procedure(AppHnd: THandle); stdcall;
TDropFrm = procedure; stdcall;
TFrm_Main = class(TForm)
Btn_1: TButton;
Btn_2: TButton;
Btn_3: TButton;
Btn_4: TButton;
Btn_5: TButton;
Btn_6: TButton;
Btn_7: TButton; procedure Btn_1Click(Sender: TObject);
procedure Btn_2Click(Sender: TObject);
procedure Btn_3Click(Sender: TObject);
procedure Btn_4Click(Sender: TObject);
procedure Btn_5Click(Sender: TObject);
procedure Btn_6Click(Sender: TObject);
procedure Btn_7Click(Sender: TObject);
private
LibHandle: THandle;
FormRef: LongInt;
{ Private declarations }
public
{ Public declarations }
end; var
Frm_Main: TFrm_Main;
APara: TPara; implementation {$R *.dfm} procedure TFrm_Main.Btn_1Click(Sender: TObject);
begin
if LibHandle = 0 then
begin
LibHandle := SafeLoadLibrary('SubMain.dll');
if LibHandle = 0 then
raise Exception.Create('Not Found Dll File')
else
ShowMessage('Dll Loaded');
end;
end; procedure TFrm_Main.Btn_2Click(Sender: TObject);
begin
if LibHandle > 0 then
begin
FreeLibrary(LibHandle);
LibHandle := 0;
ShowMessage('Dll UnLoaded');
end;
end; procedure TFrm_Main.Btn_3Click(Sender: TObject);
var
CreateFrm: TCreateFrm;
begin
if LibHandle = 0 then
raise Exception.Create('Place Load Dll File First'); @CreateFrm := GetProcAddress(LibHandle,PChar('CreateFrm'));
if @CreateFrm = nil then
raise Exception.Create('Function Error'); APara.ADOConnStr := 'Provider=SQLOLEDB.1;Password=*****;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=127.0.0.1'; //结构体赋值
CreateFrm(Application.Handle,APara);
end; procedure TFrm_Main.Btn_4Click(Sender: TObject);
var
DropFrm: TDropFrm;
begin
@DropFrm := GetProcAddress(LibHandle,PChar('DropFrm'));
if @DropFrm = nil then
raise Exception.Create('Function Error'); DropFrm;
end; procedure TFrm_Main.Btn_5Click(Sender: TObject);
var
CreateSubFrm: TCreateSubFrm;
begin
if LibHandle = 0 then
raise Exception.Create('Place Load Dll File First'); @CreateSubFrm := GetProcAddress(LibHandle,PChar('CreateSubFrm'));
if @CreateSubFrm = nil then
raise Exception.Create('Function Error'); CreateSubFrm(Application.Handle);
end; procedure TFrm_Main.Btn_7Click(Sender: TObject);
begin
ShowMessage(APara.ADOConnStr); //用来释放Dll后,验证结构体内存块是否同步被释放
end; end.
Dll引用代码:
unit SubMain_Unit; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, FyDataConn_Unit, ActiveX,
ADODB, StdCtrls, cxGraphics, cxControls, cxLookAndFeels,
cxLookAndFeelPainters, cxStyles, dxSkinsCore, dxSkinBlueprint,
dxSkinDevExpressDarkStyle, dxSkinDevExpressStyle, dxSkinHighContrast,
dxSkinSevenClassic, dxSkinSharpPlus, dxSkinStardust, dxSkinTheAsphaltWorld,
dxSkinVS2010, dxSkinWhiteprint, dxSkinscxPCPainter, cxCustomData, cxFilter,
cxData, cxDataStorage, cxEdit, cxNavigator, cxDBData, cxGridLevel, cxClasses,
cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
cxGrid, Grids, DBGrids,dxCore; type
TPara = record //与主程序定义一个一样的结构体
ADOConnStr: String;
end;
TPPara = ^TPara; //定义该结构体的指针结构
TFrm_SubMain = class(TForm)
Btn_1: TButton;
GTV_1: TcxGridDBTableView;
GL_1: TcxGridLevel;
Grd_1: TcxGrid;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure Btn_1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
DSet: TADODataSet;
DS: TDataSource;
Conn: TADOConnection;
{ Private declarations }
public
{ Public declarations }
end;
procedure CreateFrm(AppHnd: THandle; APar: TPara);export;stdcall;
procedure DropFrm; export;stdcall; var
Frm_SubMain: TFrm_SubMain;
LocPara: TPara;
PPara: TPPara; implementation {$R *.dfm}
procedure CreateFrm(AppHnd: THandle; APar: TPara);
begin
Application.Handle := AppHnd;
PPara := @APar; //直接
if not Assigned(Frm_SubMain) then
Frm_SubMain := TFrm_SubMain.Create(Application); Frm_SubMain.Show;
end; procedure DropFrm;
begin
if Frm_SubMain <> nil then
FreeAndNil(Frm_SubMain);
end;
procedure TFrm_SubMain.Btn_1Click(Sender: TObject);
var
SQL: String;
begin
DSet.Connection := Conn;
DS.DataSet := DSet;
SQL := 'Select * From Cg_CgDanSub';
dbOpen(SQL,DSet); //自定义函数,用于打开数据集
GTV_1.DataController.DataSource := DS;
(GTV_1.DataController as IcxCustomGridDataController).DeleteAllItems; //清除cxGrid列
(GTV_1.DataController as IcxCustomGridDataController).CreateAllItems(False); //添加cxGrid列 end; procedure TFrm_SubMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end; procedure TFrm_SubMain.FormCreate(Sender: TObject);
begin
Conn := TADOConnection.Create(Application);
Conn.LoginPrompt := False;
Conn.ConnectionString := PPara.ADOConnStr;
//Conn.ConnectionString := 'Provider=SQLOLEDB.1;Password=fydesign;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=127.0.0.1';
Conn.Connected := True;
DSet := TADODataSet.Create(Application);
DS := TDataSource.Create(Application);
end; procedure TFrm_SubMain.FormDestroy(Sender: TObject);
begin
DSet.Free;
DS.Free;
FreeAndNil(Conn);
Frm_SubMain := nil;
end;
initialization
dxInitialize;
finalization
dxFinalize;
end.
Dll学习三_Dll 相互间以及主程序间的数据共享——测试未通过,应该用内存映射的更多相关文章
- Dll学习二_Dll 窗体中动态创建数据并使用Demo
		沿用上一篇Demo 环境:DelphiXE,XP,SQL2005 贴出改动过的单元代码: dbGrid控件版: unit SubMain_Unit; interface uses Windows, M ... 
- Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo
		1.新建Dll工程 2.Dll工程全部代码 library SubMain; { Important note about DLL memory management: ShareMem must b ... 
- Windows进程间通讯(IPC)----内存映射文件
		内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ... 
- Android JNI学习(三)——Java与Native相互调用
		本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ... 
- docker深入学习三
		docker学习三:network docker支持容器之间的网络通信,docker的网络通信方式有以下五种: bridge docker 默认的网络驱动,如果不指定网络驱动,docker就会创建一个 ... 
- ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例
		1. Logstash输入插件 1.1 input介绍 logstash支持很多数据源,比如说file,http,jdbc,s3等等 图片上面只是一少部分.详情见网址:https://www.elas ... 
- Java开发学习(三十六)----SpringBoot三种配置文件解析
		一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ... 
- dll学习
		Dll:动态链接库 动态链接库(dll)是包含共享函数库的二进制文件,可以被多个应用程序同时使用.建立应用程序的可执行文件时,不必将DLL连接到应用程序中,而是在运行时动态装载DLL,装载时DLL被映 ... 
- HTTP学习三:HTTPS
		HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ... 
随机推荐
- 推荐一个代码生成工具:freemarker
			freemarker:http://freemarker.org/ 还有velocity:http://velocity.apache.org/ 
- JQuery上传插件uploadify优化
			旧版的uploadify是基于flash上传的,但是总有那么些问题,让我们用的不是很舒服.今天主要分享下在项目中用uploadify遇到的一些问题,以及优化处理 官方下载 官方文档 官方演示 下面是官 ... 
- 菜鸟学四轴控制器之3:数字积分法DDA实现直线插补
			上一篇的逐点比较法显然是无法画一条有倾角的直线的.因为X轴和Y轴永远都不同步,也就是像打台球一样,你打一个,我打一个,如果我进了球,我再接着打一个. 也就是说,如果直线为45度,也是没有办法画出来的, ... 
- js获取服务器控件DropDownList所选中的各项属性
			var ddl = document.getElementById("DropDownList1"); alert(ddl.selectedIndex);//选择索引值 alert ... 
- Exercises - Kangaroo
			Write a definition for a class named Kangaroo with the following methods: An __init__ method that in ... 
- win7突然无法启动(以前可以启动的,电脑是ubuntu+win7双系统)
			这里 有个解决办法是将win7的menuentry里的chainloader +1改为ntldr /bootmgr,但是这个解决办法是基于把Boot Loader指定在/dev/sda1里了,即win ... 
- 安全终止MFC线程
			终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ... 
- C和C++混合编译
			关于extern_C 通常,在C语言的头文件中经常可以看到类似下面这种形式的代码: #ifdef __cplusplus extern "C" { #endif /**** som ... 
- 【MySQL】Event事件与游标
			MySQL的事件就像Linux系统上的定时任务,按照设置的时间或者间隔时间执行设置好的任务. 如果用SQLyog一类的写存储过程.触发器或者事件会省事一些,例如SQLyog就会生成一个大致的模板: D ... 
- 关于Java中形参与实参的理解
			今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.htm ... 
