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.
主程序:
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.