请指教:接收PostMessage中传入字符串的问题,在线等,谢谢(50分)

  • 主题发起人 主题发起人 redcoffee
  • 开始时间 开始时间
R

redcoffee

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是一VC写的COM,COM中这样写:
postMessage(wm_user + ***,(wParam)buff,(lParam)nLen);

我用Delphi这样接收的:
Procedure GetMessage(var message : TMessage); wm_user + ***;
p := PChar(message.WParam);
ss := string(p);
showmessage(ss);

接收不到,但我可以收到Buff的长度,即能取到lParam的值(nLen)

请问这样的情况下,我如果将buff中的内容取出来??
 
帮顶,兄弟姐妹们帮忙啊
 
你先用move看看message.lParam所指向的内存里有没有数据。
 
哦打错了,是wparam
 
你的buff先分配内存没有?
如:buff=LocalAlloc(LPTR,nLen);
strcpy(buff,"a string");
PostMessage(......);
在delphi中要记得LocalFree哦
 
谢谢大家,我看看,
有的说这个方法,不能传递过来字符串,不知是真是假
 
formality,请问:在delphi中,如果看wPara内存中有没有数据,:(
 
方法是可以的,不过你要注意string中有0会截断的, 我是这样用的
char *pSMS=(char *)(Message.LParam);
int SMS_Index= Message.WParam;
char tmp[30];
strcpy(tmp,pSMS);
AnsiString Src_Terminal_ID=AnsiString(tmp);
Src_Terminal_ID=Src_Terminal_ID.SubString(Src_Terminal_ID.Length()-10,11);
strcpy(tmp,pSMS+15);
AnsiString sDate=AnsiString(tmp);
AnsiString SMS_Content=AnsiString(pSMS+35);
 
这么...,不过我试试看,
还有就是formality说的,我的WParam为一值,是不是字符串所处的内存地址,能不能看到WParam中在内存中的内容,怎么看?
 
zygtp,你的是C++的吧?
 
var
lpSend:array of Char;
begin
setlength(lpSend,Datasum)
Move(string[1],lpSend,datasum);//string[1]代表你发送内容的地址
lpSend[Datasum]:=#0;
PostMessage( hComm32Window, PWM_GOTCOMMDATA, WPARAM(DataSum),LPARAM(@LpSend[0]));

//************************************************收到数据时
var
str:string;
begin
str:=PChar(msg.lparam)//看看这里有没有数据。
除非必要,不要自己去LocalAlloc堆内存。
管理起来很麻烦。
 
进程有自己的内存空间,并且两个进程之间的内存不可互相访问,你不能用LocalAlloc分配内存,应该用GlobalAlloc分配内存,如果不在全局区域上分配内存,另外一个进程是永远不可能看到实际内容的。
 
谢谢,这个问题有点麻烦,因为VC的COM 不是我写的
formality:他是这样做的(postMessage(wm_user + ***,(wParam)buff,(lParam)nLen);)
你的意思是说,首先要看一样,发送时数据是不是存在?
 
对啊,如果都没发出去数据你怎么能收的到呢。
如果已经发出来了,那你在检查你收这快。不过收这里应该没什么问题。
顺便问一下你的这个VC的COM不会是属于另外一个进程吧?也就是说这个COM应该是属于你的进程内的吧?
 
把buffer 声明的类型贴出来看看。如果是局部变量有可能发出去一个‘’
 
谢谢大家,现在发送端改为了copydata方式,发送端使用的buffer使用长度为1024(固定)
接收时使用如下:
ss := strPas((wmMsg.CopyDataStruct^).lpData);

可是接收过来的数据不稳定,有时后面会跟出一些乱码,取出了发送字符以外的内容。
因为此时查看ss的长度会比发送的长度长
 
PostMessage发送的地址不保证收到后还能够使用,请用CopyData
 
谢谢大家,现在发送端改为了copydata方式,发送端使用的buffer使用长度为1024(固定)
接收时使用如下:
ss := strPas((wmMsg.CopyDataStruct^).lpData);

可是接收过来的数据不稳定,有时后面会跟出一些乱码,取出了发送字符以外的内容。
比如我发送时,当入“123456”,接收过来后,会出现"123456"后面跟一些乱码
 
用SetStringLength把ss的长度截短,因为你传过来的数据中有长度限制的,所以这样可行。或者换成
ss := array [0..1023] of Char的声明 。
 
后退
顶部