在调用
function WriteFile(hFile: THandle; const Buffer;nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;
有个问题var
  str:string;
begin
WriteFile(hFile,pchar(str)^nBytes,lcb,nil);
        //为什么此处是pchar(str)^而不是pchar(str)
end;

解决方案 »

  1.   

    因为是按址传送。
    你传过的只是变量的地址。
    在WriteFile内部实际上用了@Buffer,
    若传PChar(Str)^的话,@(PChar(Str)^) 正好为PChar(Str)自身。
      

  2.   

    呵呵。偶用PChar(Str)好像没有问题??
      

  3.   

    我觉得这是编译器处理后的结果,传送的都应该是缓冲区的地址。
    p:pchar;
    str:string;
    p:=pchar(str);
    str存放一个32位的地址,指向一个字符串。pchar(str)返回改字符串的首地址。
    WriteFile(hFile,pchar(str)^,nBytes,lcb,nil);
    相当于
    WriteFile(hFile,p^,nBytes,lcb,nil);
    pchar(str)^,估计是编译器自己模拟了一个指针。(:)不知道怎么表达)。
    pchar(str),直接把返回的32位地址传过去。