下面的代码是关于发送和接受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.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;
指向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个字节的内存。
如这句:ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));
pTmp为一指针,内容1234,就是说,pTmp指向了内存地址为1234的地方,而 1234这个内存区域保存了一个字符串”1234“。pTmp -> [1234]
|
|-------
|
. ......
1234 "abcd"有兴趣的话,研究研究C语言去。
Delphi的字符串(String)不简简单单的是个指针。在Length, Copy等函数调用或者:=赋值操作的时候,就不同了。只是这些东西都让编译器帮你完成了。
这句:ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData));
应该为如这句:ShowMessage(PChar(PCOPYDataStruct(AMsg.LParam)^.lpData)^);(可是这样却不对)
才对,但是PChar这个字符指针
既可以做指针,又能代表他指向的内容,并且在代表他指向的内容的时候不需要用运算符^吗?