DLL的代码:
library Project1;
uses
ShareMem,
Windows,
SysUtils,
Classes;
Const
cMMFileName:PChar='ShareMapData';{$I DLLDATA.INC}
{$R *.res}
var
GlobalData:PGlobalDLLData;
MapHandle:THandle;Procedure GetDLLData(var AGlobalData:PGlobalDLLData);
begin
AGlobalData:=GlobalData;
end;Procedure OpenShareData();
var
Size:integer;
begin
Size:=Sizeof(TGlobalDLLData);
MapHandle:=CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,Size,cMMFileName);
if MapHandle=0 then
RAISELASTWIN32ERROR;
GlobalData:=MapViewOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,Size);
if GlobalData=nil then
begin
CloseHandle(MapHandle);
RAISELASTWIN32ERROR;
end; GlobalData^.S:='ShareLib';
GlobalData^.I:=1;
end;Procedure CloseShareData();
begin
UnMapViewOfFile(GlobalData);
CloseHandle(MapHandle);
end;Procedure DLLEntryPoint(DWReason:DWord);
begin
case DWReason of
DLL_PROCESS_ATTACH:OpenShareData;
DLL_PROCESS_DETACH:CloseShareData;
end;
end;Exports GetDLLData;begin
DLLProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.inc的代码
type
PGlobalDLLData=^TGlobalDLLData;
TGlobalDLLData=Record
S:String[50];
I:Integer;
End;调用的代码public
GlobalData:PGlobalDLLData;
end;
var
Form1: TForm1;
Procedure GetDLLData(var AGlobalData:PGlobalDLLData);Stdcall External 'Project1.DLL';implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
GetDLLData(GlobalData);
Edit1.Text:=GlobalData^.S;
Edit2.Text:=IntToStr(GlobalData^.I);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
GlobalData^.S:=Edit3.Text;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
GlobalData^.I:=StrToInt(Edit4.Text);
end;为何出错呢?
请指教!
library Project1;
uses
ShareMem,
Windows,
SysUtils,
Classes;
Const
cMMFileName:PChar='ShareMapData';{$I DLLDATA.INC}
{$R *.res}
var
GlobalData:PGlobalDLLData;
MapHandle:THandle;Procedure GetDLLData(var AGlobalData:PGlobalDLLData);
begin
AGlobalData:=GlobalData;
end;Procedure OpenShareData();
var
Size:integer;
begin
Size:=Sizeof(TGlobalDLLData);
MapHandle:=CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,Size,cMMFileName);
if MapHandle=0 then
RAISELASTWIN32ERROR;
GlobalData:=MapViewOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,Size);
if GlobalData=nil then
begin
CloseHandle(MapHandle);
RAISELASTWIN32ERROR;
end; GlobalData^.S:='ShareLib';
GlobalData^.I:=1;
end;Procedure CloseShareData();
begin
UnMapViewOfFile(GlobalData);
CloseHandle(MapHandle);
end;Procedure DLLEntryPoint(DWReason:DWord);
begin
case DWReason of
DLL_PROCESS_ATTACH:OpenShareData;
DLL_PROCESS_DETACH:CloseShareData;
end;
end;Exports GetDLLData;begin
DLLProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.inc的代码
type
PGlobalDLLData=^TGlobalDLLData;
TGlobalDLLData=Record
S:String[50];
I:Integer;
End;调用的代码public
GlobalData:PGlobalDLLData;
end;
var
Form1: TForm1;
Procedure GetDLLData(var AGlobalData:PGlobalDLLData);Stdcall External 'Project1.DLL';implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
GetDLLData(GlobalData);
Edit1.Text:=GlobalData^.S;
Edit2.Text:=IntToStr(GlobalData^.I);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
GlobalData^.S:=Edit3.Text;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
GlobalData^.I:=StrToInt(Edit4.Text);
end;为何出错呢?
请指教!
// 使用指针前 请先分配空间...
Procedure GetDLLData(var AGlobalData:PGlobalDLLData);Stdcall External 'Project1.DLL';
// 不用这样了 可以
1:(var AGlobalData:GlobalDLLData) pass by reference
2. (AGlobalData:PGlobalDLLData) pass by pointer;
begin
AGlobalData:=GlobalData;
end;上面的有問題, PGlobalDLLData 是一個指針,
你應用用
CopyMemory 之類的來付值才對, 直接 指針 := 指針, 傳剃過去應該得到的值是不對的
我跟了一下
procedure TForm1.Button1Click(Sender: TObject);
begin
GetDLLData(GlobalData);
Edit1.Text:=GlobalData^.S; //这个时候不出错,GlobalData^也对呀,是'ShareLib'和1
Edit2.Text:=IntToStr(GlobalData^.I);//也不出错
end; //这句话执行完以后就出错了。弹出来汇编的调试窗口。我不是很了解,所以调试很困难。aiirii(ari-爱的眼睛) ,如果象我说的GlobalData^也是对的,是不是就说明了GlobalData可以不创建直接用呢。请大家帮个忙吧。我的这个例子是从Delphi5开发人员指南第9章里得到的,有时间的话大家可以帮忙给看看。
然后 GetDLLData(◎GlobalData);
Edit1.Text:=GlobalData.S; try this way
我 下载了源代码,原来少写了一个STDCALL,谢谢大家!