type
  TREG=function (Data:PChar):Boolean;stdcall;function Reg(Data:pchar):Boolean; external 'Project2.dll';procedure TForm1.Button1Click(Sender: TObject);
var
  p:TREG;
  h:thandle;
  s:String;
begin
...]
  s:='abcd';
  h:=LoadLibrary('project2.dll');
  p:=nil;
  if h<>0 then
  begin
     @p:=GetProcAddress(h,'Reg');
     p(PChar(s));
  end;
//  if Reg(PChar(s)) then Statusbar1.SimpleText:='Set success!';
end;==========DLL代码===========function Reg(Data:Pchar):Boolean;stdcall;
begin
  MessageBox(0,Data,'testaaa',mb_ok);
end;exports
   RegHook;
...很是奇怪,
首先,我是直接使用function RegHook(Data:pchar):Boolean; external 'Project2.dll';这种方式来引用DLL文件中的函数,在程序代码注释那部分中调用了DLL文件中的函数Reg,但弹出的提示框显示的内容是不认识的字符。
后来,我改成用GetProcAddress()函数取DLL文件函数的地址来调用函数Reg,弹出的提示框可以正常的显示abcd四个字符,这是什么原因呢?问题出在哪?还请大侠高手们指点,谢谢!

解决方案 »

  1.   

    请问一个关于内存映射的问题,代码如下:
    type
       PDataM=^DataM;
       DataM=record
          a:pchar;
          b:HHOOK;
       end;var
       pdata:PDataM;
       pHandle:THandle;procedure CreateMap;
    begin
      pHandle:=CreateFileMapping(Dword(-1),nil,PAGE_READWRITE,0,sizeOf(DataM),'TestMap');
      pData:=MapViewOfFile(pHandle,FILE_MAP_ALL_ACCESS,0,0,0);
    end;funtion setData(a:pchar):boolean;stdcall;
    begin
      pData.a:=a;
      pData.b:=setWindowHookEx(...);
    end;function CBTProc(...);
    begin
      messagebox(0,pData.a,'Test',mb_ok);  //这个地方会报错!
      ... 
    end;procedure DLLEntryPoint(dwDeason:DWORD);
    begin
      case dwReason of
        DLL_PROCESS_ATTACH:CreateMAP;
        DLL_PROCESS_DETACH:ReleMAP;
    end;exports
       setData;begin
       DLLProc=@DLLEntryPoint;
       DLLEntryPoint(DLL_PROCESS_ATTACH);
    end;===========主程序==========  function setData(a:pchar):boolean;stdcall;implemenation
      function setData;external 'Test.dll';procedure TForm1.Button1Click(sender:TObject);
    begin
      setData('abcd');
    end;当钩子WH_CBT捕捉到消息后,执行到message()这一句会报错:
      '0x77e197d8'指令引用的'0x00d54af4'内存,该内存不能为Read.
    这个错误是怎么引起的呢?是不是内存映射没有建好?还请高手大侠们指点,谢谢!