下面的代码是关于发送和接受WM_COPYDATA消息的,有几个问题不明白,请教大家.
1.PChar是一种什么类型,指针么?
2.GetMem()这个东西是干什么用的,能给个详细说明就好了
3.ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));这句看不懂,
总觉得PCOPYDataStruct(AMsg.LParam)^.lpData是个指针,用PChar转下就成字符串了么?难道Pchar是字符串类型的,不是指针?
而StrCopy(Buf,PChar(s));是不是说明了Pchar是指针类型呢?
谢谢!procedure SendMessageTo(Handle:HWND;s:string);
const
  Msg = $2008;
var
  DataBuffer:TCopyDataStruct; //WM_COPYDATA消息的lParam字段数据类型
  Buf:PChar;
  BufSize:Integer;
begin
  BufSize := Length(s);
  GetMem(Buf,BufSize);
  StrCopy(Buf,PChar(s));
  try
    with DataBuffer do
    begin
      dwData := Msg;
      cbData := BufSize;
      lpData := Buf;
    end;
    SendMessage(Handle,WM_COPYDATA,0,LongInt(@DataBuffer));
  finally
    FreeMem(Buf,BufSize);
  end;
end;  procedure TForm1.WMCOPYDATA(var AMsg:TMessage);
const
  Msg = $2008;
begin
  if PCOPYDataStruct(AMsg.LParam)^.dwData = Msg then
  begin
    ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));
  end;
end;

解决方案 »

  1.   

    1.PChar是一种什么类型,指针么? 
      指向Char类型的指针。类似C语言中的char*.2.GetMem()这个东西是干什么用的,能给个详细说明就好了 
      内存分配函数。
      var
        pBuf: pointer;
      begin
        GetMem(pBuf, 256);
        //...
      end;
      
    3.ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));这句看不懂, 
      
      AMsg.LParam, LPARAM类型, 4个字节。
      PCOPYDataStruct(AMsg.LParam), 将AMsg.LParam转换成PCOPYDataStruct结构体指针。
      PCOPYDataStruct(AMsg.LParam)^.lpData, 取PCOPYDataStruct结构体中字段lpData数据。
      PChar(PCOPYDataStruct(AMsg.LParam)^.lpData),强制将lpData数据转换成PChar类型。
      ShowMessage(...)  // 显示一个对话框

    总觉得PCOPYDataStruct(AMsg.LParam)^.lpData是个指针,用PChar转下就成字符串了么?
      类型的强制转换。可以这么理解。
    难道Pchar是字符串类型的,不是指针? 
       PChar是指针。pointer to char.而StrCopy(Buf,PChar(s));是不是说明了Pchar是指针类型呢? 
      PChar是指针。占4个字节的内存。
      

  2.   

    既然PChar是指针,类型强制转换过后应该还是指针啊,怎么PChar又可以直接当字符串类型用呢?
    如这句:ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));
      

  3.   

    showmessage可以对pchar自动转为string类型,pchar转为string类型只需要“:=”就可以了,需要提醒的delphi的string类型是一种新的字符串类型,不用声明大小,据说可以存到2G大小,
      

  4.   

       ShowMessage的时候delphi自动转换了。将PChar转换成了String.你可以在ShowMessage这个地方设置断点,按下F7,就可以跟进去看这个转换过程。我看你是没理解啥是指针吧?就是一个4个字节的内存空间,里面放了一个值,这个值就是这个指针指向的地方。
    pTmp为一指针,内容1234,就是说,pTmp指向了内存地址为1234的地方,而 1234这个内存区域保存了一个字符串”1234“。pTmp -> [1234]
              |
      |-------
      |
      .     ......
      1234   "abcd"有兴趣的话,研究研究C语言去。
      

  5.   


      Delphi的字符串(String)不简简单单的是个指针。在Length, Copy等函数调用或者:=赋值操作的时候,就不同了。只是这些东西都让编译器帮你完成了。
      

  6.   

    既然是指针,取得指针指向的值的时候不是要加上^运算符么?,比如 
    这句:ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));
    应该为如这句:ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData)^);(可是这样却不对)
    才对,但是PChar这个字符指针 
    既可以做指针,又能代表他指向的内容,并且在代表他指向的内容的时候不需要用运算符^吗?
      

  7.   

    你的意思是不是,只要使用":="给Pchar类型变量赋值,那么这个变量就自动转为STring类型了?
      

  8.   

    pchar()是将括号里的数据转为一个pchar类型,而这个数据如果不用^的话那括号里是地址,将地址转为pchar类型显然是严重错误的,必须将地址所指的内容转为pchar,所以加上^,至于showmessage(pchar())里为什么不加^,这个要问delphi工程师了。str:=pchar1;str就得到pchar1的值了,而str要转成pchar也是类似上面用pchar1:=pchar(str)就可以了