EXE与DLL共享文件

JB7 2008-07-08 11:17:58
我想在EXE中创建一个合局的clientdataset对象,想在DLL中也能访问这个变量,该如何操作,效果最高,
另外有个问题,要防止多个DLL同时操作这个对象导致异常现象。
...全文
163 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
YFLK 2008-07-23
  • 打赏
  • 举报
回复
这种方式对于静态数据应该可以,但对于动态数据如何保证两个EXE之间的数据同步。这是关键!!
searphchen 2008-07-15
  • 打赏
  • 举报
回复
学习中~~~
Harryfin 2008-07-14
  • 打赏
  • 举报
回复
首先问一下,内存映射可以映射复杂对象类型吗?因为楼主问的是TClientDataSet共享。

然后,我觉得楼主应该把这个DataSet做在一个BPL里面,就可以做到EXE跟DLL的共享了。
okmnji79513 2008-07-10
  • 打赏
  • 举报
回复
mark 学习
Reverse.King 2008-07-08
  • 打赏
  • 举报
回复
但如果用于直接对象共享访问好象不行.因为你无法控制对象整个代码刚好在这个共享区.
用COM,或者改下思路另想它法.
Reverse.King 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yuqianyi1974 的回复:]
2楼和3楼是两个exe间共享数据的代码,exe和dll间共享数据差不多
[/Quote]
MAP映射文件不仅限于EXE和EXE之间,应该说是进程间的通讯共享.不同进程的EXE和DLL均能访问
yuqianyi1974 2008-07-08
  • 打赏
  • 举报
回复
2楼和3楼是两个exe间共享数据的代码,exe和dll间共享数据差不多
yuqianyi1974 2008-07-08
  • 打赏
  • 举报
回复

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
WM_DATA = WM_USER + 1024;
type
PShareMem = ^TShareMem;
TShareMem = record
Data: array[0..255] of char;
end;
TMyForm = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure getShareInfo(var Msg: TMessage); message WM_DATA; {处理WM_DATA}
end;

var
MyForm: TMyForm;
PShare: PShareMem;
MapHandle: THandle;

implementation

{$R *.DFM}

procedure TMyForm.getShareInfo(var Msg: TMessage); {处理WM_DATA}
begin
if msg.LParam=1 then {是我们设定的消息参数}
Memo1.Text := PShare^.Data;
end;

procedure TMyForm.FormCreate(Sender: TObject);
begin
MapHandle := OpenFileMapping(FILE_MAP_WRITE, {获取完全访问映射文件}
False, {不可继承的}
pchar('Map Name')); {映射文件名字}
if MapHandle = 0 then
begin
ShowMessage('不能定位内存映射文件块!');
Halt;
end;
PShare := PShareMem(MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0));
if PShare = nil then
begin
CloseHandle(MapHandle);
ShowMessage('Can''t View Memory Map');
Application.Terminate;
exit;
end;
FillChar(PShare^, SizeOf(TShareMem), 0);
end;

procedure TMyForm.Button1Click(Sender: TObject);
begin
CloseHandle(MapHandle);
close;
end;

end.

yuqianyi1974 2008-07-08
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
WM_DATA = WM_USER + 1024;
type
PShareMem = ^TShareMem;
TShareMem = record
Data: array[0..255] of char;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }

end;

var
Form1: TForm1;
PShare: PShareMem;
implementation

{$R *.DFM}
var
HMapping: THandle;
HMapMutex: THandle;
const
MAPFILESIZE = 1000;
REQUEST_TIMEOUT = 1000;

procedure OpenMap;
begin
{创建一个文件映射内核对象}
HMapping := CreateFileMapping(
$FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(TShareMem),
{这个文件映射对象的名字用于与其他进程共享该对象,}
pchar('Map Name')
);
if (hMapping = 0) then
begin
ShowMessage('不能创建内存映射文件');
Application.Terminate;
exit;
end;
{将文件数据映射到进程的地址空间}
{当创建了一个文件映射对象之后,仍然必须让系统为文件的数据保留
一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。
}
PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0));
if PShare = nil then
begin
CloseHandle(HMapping);
ShowMessage('Can''t View Memory Map');
Application.Terminate;
exit;
end;

{既然我们通过pvFile得到了映象视图的起始地址,那么可以对视图做一些操作了}
end;

procedure CloseMap;
begin
if PShare <> nil then
{从进程的地址空间中撤销文件数据的映象}
UnMapViewOfFile(PShare);
if HMapping <> 0 then
CloseHandle(HMapping);
end;

function LockMap: Boolean;
begin
Result := true;
{创建互斥对象}
HMapMutex := CreateMutex(nil, false,
pchar('MY MUTEX NAME GOES HERE'));
if HMapMutex = 0 then
begin
ShowMessage('不能创建互斥对象');
Result := false;
end else begin
if WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT)
= WAIT_FAILED then
begin
ShowMessage('不能对互斥对象加锁!');
Result := false;
end
end
end;

procedure UnlockMap;
begin
{关闭文件映射对象和文件对象}
ReleaseMutex(HMapMutex);
CloseHandle(HMapMutex);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
str: pchar;
begin
str := pchar('简单的共享内存的例子');
CopyMemory(@(pShare^.data), Str, Length(str));
{发送消息表明有数据}
PostMessage(FindWindow(nil, 'MyForm'), WM_DATA, 1, 1)
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnlockMap;
CloseMap;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OpenMap;
LockMap;
end;
yuqianyi1974 2008-07-08
  • 打赏
  • 举报
回复
内存影像文件

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧