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;为何出错呢?
请指教!

解决方案 »

  1.   

    GetDLLData(GlobalData);//  GlobalData:PGlobalDLLData; 
    // 使用指针前 请先分配空间...
    Procedure GetDLLData(var AGlobalData:PGlobalDLLData);Stdcall External 'Project1.DLL';
    // 不用这样了 可以
    1:(var AGlobalData:GlobalDLLData) pass by reference
    2. (AGlobalData:PGlobalDLLData) pass by pointer;
      

  2.   

    Procedure GetDLLData(var AGlobalData:PGlobalDLLData);
    begin
      AGlobalData:=GlobalData;  
    end;上面的有問題, PGlobalDLLData 是一個指針, 
    你應用用
    CopyMemory 之類的來付值才對, 直接 指針 := 指針, 傳剃過去應該得到的值是不對的
      

  3.   

    还有 另外一个帖子 我的回复有点错误DLL非共享区中的全局数据 是被 OS 采用 COPY_ON_WRITE的方法进行保护的而共享区的则是改了都改了 大家都被影响到了8好意思
      

  4.   

    求大家帮忙了。
    我跟了一下
    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章里得到的,有时间的话大家可以帮忙给看看。
      

  5.   

    你没看我们的回复么....GlobalData你不要定义为指针类型 直接定义为一个对象
    然后 GetDLLData(◎GlobalData);
         Edit1.Text:=GlobalData.S; try this way
      

  6.   

    beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>) 谢谢了。
    我 下载了源代码,原来少写了一个STDCALL,谢谢大家!