string – 询问用户并将消息发送回消息接收器
发布时间:2020-12-15 09:34:13 所属栏目:大数据 来源:网络整理
导读:我想要求用户输入密码.由于密码有时需要在与运行VCL的主线程不同的线程中,因此我尝试向主窗口发送消息并要求输入密码.然后主窗口询问用户. 我怎么问用户: procedure TMainForm.WMGetPassword(var Msg: TMessage);var Password: String;begin if QueryPasswo
我想要求用户输入密码.由于密码有时需要在与运行VCL的主线程不同的线程中,因此我尝试向主窗口发送消息并要求输入密码.然后主窗口询问用户.
我怎么问用户: 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |