送上可用积分来请教, 关于 CreateFileMapping 和 MapViewOfFile 的用法 ( 积分: 5 )

  • 主题发起人 主题发起人 SuKiDelphi
  • 开始时间 开始时间
S

SuKiDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
如果主程序和DLL都要写入"DLLData", 不知如何改:
主程序:
type
TData = record
IntA, IntB :Integer;
end;
PData=^TData;

var
Form1: TForm1;
FHandle: LongWORD;
DLLData: PData;
function SetDllDate : boolean; stdcall; external 'MYDLL';



//------------------------------------------------------------------------------

procedure TForm1.AppSetting(WriteSet : boolean);
var
TId : DWORD;
begin
// 其它功能的代码...........
直接用"DLLData"
with DLLData^ do
begin
IntA:=10;
IntB:=10;
SetDllDate; //更新DLL 文件的"DllDate"数据
end;
end;




procedure TForm1.FormDestroy(Sender: TObject);
begin
if DLLData <> nil then
UnmapViewOfFile(DLLData);
if FHandle <>0 then
CloseHandle(FHandle);
end;

//------------------------------------------------------------------------------



DLL 文件:

library MYDLL;

uses
Windows , Messages, {Dialogs,} SysUtils, Registry;

//windwos.pas中封装了HOOK的所有API函数。

{$R *.res}
type
TData = record
IntA, IntB :Integer;
end;
PData=^TData;

var
DLLData: PData;


//------------------------------------------------------------------------------

function SetDllDate : boolean; //外部调用
var
FHandle: LongWORD;
DLLData : PData;
begin
FHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TData), '999999999999999');
if FHandle <> 0 then
DLLData:=MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData <> nil then
with DLLData^ do
begin
IntA:=3;
end;

Result:=True;


end;


//------------------------------------------------------------------------------
function myfunction : boolean;
begin
if 事件 then SetDllDate; //要经常调用来读入,写入"DllDate"
end;

//------------------------------------------------------------------------------

procedure MyDLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH : begin
SetDllDate;
end;

DLL_PROCESS_DETACH : begin
if DLLData <> nil then UnmapViewOfFile(DLLData);
end;
end;
end;


//------------------------------------------------------------------------------

exports
SetDllDate;

begin
DLLProc:=@MyDLLHandler;
MyDLLhandler(DLL_PROCESS_ATTACH);
//********************************

end.
 
unit Common

interface

uses
classes;

type
TData = record
IntA, IntB :Integer;
end;
PData=^TData;

implementation
end.
//===========================
unit DllImplete

interface

uses
classes,common;
implementation
var
DLLData : PData;

//.......其他函数与你的相同。。。。
function SetDllDate : boolean; //外部调用
var
FHandle: LongWORD;
begin
FHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TData), '999999999999999');
if FHandle <> 0 then
DLLData:=MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData <> nil then
with DLLData^ do
begin
IntA:=3;
end;

Result:=True;


end;
//增加一个函数用于应用程序写入数据
procedure WriteData(AData:TData);
begin
if not assigned(DLLData) then setDllData;
DLLdata^.IntA:=AData.IntA;
Dlldata^.IntB:=AData.IntB;
end;

//同理,增加一个人÷从Dll读数据的函数
functoion ReadData:Tdata;
begin
if not assigned(DllData) then raise exception.create('jjjj');
result^.intA:=DllData.IntA;
result^.intB:=DllData.IntB;
end;
end.
//===========================
library Project2;

uses
ShareMem,
SysUtils,
Classes,
common in 'common.pas',
DllImplete in 'DllImplete.pas';

{$R *.res}
exports .....WriteData,ReadData.................;
begin
...................

end.
 
还是不行, DLL文件读不入主程序设的数据,可以给个程序和DLL共享数据的例子吗?

主程序:

procedure TrxjhQEAPEX.FormCreate(Sender: TObject);
begin
FHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TData), '0123456789');
if FHandle<>0 then
begin
DLLData:=MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData <> nil then
begin
with DLLData^ do
begin
IntA:=9;
end;
end;
end;


DLL文件:

FHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TData), 'kagayaki');
if FHandle <> 0 then
DLLData:=MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Showmessage(InttoStr(DLLData^.IntA)); // 读入是0
 
看不明白
可以帮项一下
一同学习学习
 
找到问题了,结了!!
 

Similar threads

I
回复
0
查看
793
import
I
I
回复
0
查看
696
import
I
I
回复
0
查看
893
import
I
I
回复
0
查看
741
import
I
后退
顶部