我怎么问用户:
procedure TMainForm.WMgetpassword(var Msg: TMessage);var Password: String;begin if queryPassword(Password) then // function queryPassword(out Password: String): boolean; begin Password := Password + #0; // Add #0-Terminator Move(Password[1],Msg.wParam,Length(Password) * sizeOf(Char)); // copy the String in my buffer Msg.Result := 1; end else begin Msg.Result := 0; end;end;
我怎么问主窗口:
var PasswordBuffer: PChar; Password: String;begin PasswordBuffer := Allocmem(100 * sizeof(Char)); PasswordResult := SendMessage(MainFormHWND,WM_getpassword,Integer(PasswordBuffer),0); Result := (PasswordResult <> -1); if not Result then Exit; SetString(Password,PasswordBuffer,100); ShowMessage(Password);end;
但之后Password和PasswordBuffer为空.我究竟做错了什么?
解决方法 只要线程在同一进程中(因此它共享相同的地址空间),您的代码就可以工作.然而,这是不必要的复杂和内存泄漏(从不释放PasswordBuffer).您可以在线程中使用字符串变量,并将地址传递给其内部预分配缓冲区到主线程:
type TTestThread = class(TThread) private fHwnd: HWND; protected procedure Execute; overrIDe; public constructor Create(AWnd: HWND); end;constructor TTestThread.Create(AWnd: HWND);begin fHwnd := AWnd; inherited Create(False);end;procedure TTestThread.Execute;const MAXLEN = 1024;var s: string;begin SetLength(s,MAXLEN); if SendMessage(fHwnd,WM_getpassWORD,MAXLEN,LParaM(@s[1])) > 0 then begin s := PChar(s); // don't use VCL here windows.MessageBox(0,PChar('password is "' + s + '"'),'password',MB_ICONinformatION or MB_OK); end;end;
在主线程中,密码被放入缓冲区,长度限制为缓冲区大小:
procedure TForm1.WMgetpassword(var AMsg: TMessage);var Pwd: string;begin if inputquery('Password Entry','Please enter the password:',Pwd) and (Pwd <> '') then begin StrPLcopy(PChar(AMsg.LParam),Pwd,AMsg.WParam); AMsg.Result := 1; end else AMsg.Result := -1;end;总结
以上是内存溢出为你收集整理的string – 询问用户并将消息发送回消息接收器全部内容,希望文章能够帮你解决string – 询问用户并将消息发送回消息接收器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)