Delphi中,怎么实现两个系统间数据交换

Delphi中,怎么实现两个系统间数据交换,第1张

DLL是创建Windows应用程序,实现代码重用的重要手段。那么当我们需要在进程间共享数据时,怎样做才能快捷方便地实现呢?在32位应用系统中,每个应用程序会将DLL映射到自己的地址空间,同时DLL中的数据也就随之被映射了。这样,每个应用程序都有自己的数据实例,在一个应用程序中修改DLL中的全局变量,不会影响其它的应用程序。DLL的使用似乎与我们的目的相背离,那么如何才能实现我们想要的东东呢?这里给大家介绍一种特殊的技术,那就是内存映射文件。 内存映射文件提供了一种方法,就是在WIN32系统的地址空间保留一块内存区域,物理存储可以向其中提交。并且内存映射文件不只是磁盘文件,也可以是WIN32的页面文件,而且后者比前者要好,因为这意味着可以像访问一个磁盘文件那样访问内存中的一个区域,而不用创建临时文件,用完后还得删除它。WIN32有自己的管理页面调度文件,当不需要页面调度文件时,系统会自动将有关区域释放。以下是具体的实现代码: library Project1 uses shareMem, windows, SysUtils, Classes const MFileName: Pchar = ’ShareData’ //定义一个记录类型,你所需要共享的数据就保存在这里。 //当在进程中调用GetDllData时,进程中也应该定义一个与这个一样的记录类型。 type PGlobalDllData = ^TGlobalDllData TGlobalDllData = record s: string[50] i: integer end var GlobalData: PGlobalDllData//这是一个全局变量,指向创建的内存映射文件。 MapHandle: THandle //给外部进程调用的过程,当外部进程调用这个过程后,形参AGlobalData就指向了我//们创建的内存映射文件. 我们可以创建两个进程, 同时调用这个过程, 那么在其中一个进 //程中修改数据后, 在另外一个进程中既可反应出来, 实现了我们需要的共享. procedure GetDllData(var AGlobalData: PGlobalDllData)stdcallbegin AGlobalData := GlobalData end procedure OpenThisData var size: integer begin size := sizeof(TGlobalDllData) //创建一个内存文件映射对象,MfileName保存的值就是该对象的名字。 mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size, MFileName) if mapHandle = 0 then RaiseLastWin32Error //把文件的视图映射到调用进程的地址空间,该函数的返回值就是该对象的首地址。注//意,这是调用进程的地址,两个应用程序调用该DLL,返回值是不一样的。 GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0, size) Globaldata^.s := ’TEST’ GlobalData^.i := 5 if GlobalData = nil then begin CloseHandle(MapHandle) RaiseLastWin32Error end end //DLL从进程中分离出来时,应该释放相应的空间 procedure CloseThisData begin unmapViewOfFile(GlobalData) closeHandle(MapHandle) end procedure DllEntryPoint(dwReason: DWord) begin case dwReason of Dll_Process_Attach: OpenThisData//调用DLL时传入的参数,由系统自动传入 Dll_Process_Detach: CloseThisData//释放DLL时传入的参数,系统自动传入。 end end {$R *.res} exports GetDllData//外部应用程序调用的就是这个过程。 begin DllProc := @DllEntryPoint//该变量是一个全局变量,由它来指定DLL的入口及出 //口函数。 DllEntryPoint(Dll_Process_Attach) end. //以上代码在DELPHI6中编译通过。

使用Delhpi可以方便而快速地建立强大的数据库应用程序,可以和Paradox、dbase、Lo cal InterBase Server、Foxpro及ODBC数据源等多种桌面型数据库直接配合使用。

数据库转换方法

1.所使用的控件

2.TBatchMove控件的使用

TBatchMove允许在一组记录或是整个数据表中执行特种作业,这个控件的主要用途在于 把数据从服务器中卸到本地的数据源供分析或进行其他 *** 作。TBatchMove可以在目的地建立 对应于原数据表内容的数据表,自动将列名及数据类型进行适当的对应 *** 作。

TBatchMove两个特性指明批量移动(Batch Move) *** 作的源表及目的表。Source指定一个 对应于已有的源数据表的数据集(一个Tquery或Ttable控件),Destination指明对应于一个数 据库数据表的Ttable控件,目的数据表可以是已经存在的也可以是不存在的。

Mode特性指明TBatchMove对象所要做的事情:

我们可以根据batCopy模式,对数据库类型进行适当的转换,以下是从dBASE类型到其它类 型之间的转换结果:

数据库转换举例

现有用Foxbase开发的财务程序中的会计科目数据库(kjkmk.dbf),系统将升级到Window s环境下开发,数据库将采用Paradox语言。为了沿用该库结构和数据,可采用如下方法进行转 换。

1.Datasource1控件:

AutoEdit True

DataSet Table1

Enabled True

Name DataSorce1

2.Table1控件:

DatabaseName cw

Name Table1

Readonly False

TableName KJKMK

TableType udBase

Datasource1控件和Table1控件共同定义被转换的源文件,该文件是在别名为cw里的kjk mk,文件类型为Dbase。

3.BatchMove1控件:

Destination Table2

Mode balCopy

Name BatchMove1

Sorce Table1

MatchMovel控件定义转换类型为Copy以及源文件、目标文件。

4.Datasource2控件:

AutoEdit True

DataSet Table2

Enabled True

Name DataSorce2

.Table2控件:

DatabaseName cwdb

Name Table2

Readonly False

TableName KJKMK

TableType uParadox

Datasource2控件和Table2控件共同定义转换后的目标文件,该文件是在别名为cwdb里的 kjkmk,文件类型为Paradox。

6.StringGrid1控件:

Datasorce Datasorce1

Name StringGridl

StringGridl网格控件先定义源文件,执行转换后再定义目标文件,主要用于方便查看。

7.Button1控件:

OnClck ButtonClck

OndragDrop

Ondragover

OnEnddrag

该控件有一个OnClick事件,表示执行文件类型转换。其代码如下:

procedure TForm1.Button1Click(Sender:TObject)

begin

BatchMove1.execute

end

经上述方法定义,编译执行后,即可将kjkmk.dbf文件转换成kjkmk.db文件,然后就可以用 Database Desktop工具对其进行修改调整。

用此方法还可进行其它任意文件的转换。

类似这样:

声明DLL中包含的类型 typeDLL myDLL

调用 DLL中相应的方法获取返回值 data:String = myDLL .SomeFunc(....)

使用返回值: edit1.Text = data:String


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6758232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存