string – 询问用户并将消息发送回消息接收器

string – 询问用户并将消息发送回消息接收器,第1张

概述我想要求用户输入密码.由于密码有时需要在与运行VCL的主线程不同的线程中,因此我尝试向主窗口发送消息并要求输入密码.然后主窗口询问用户. 我怎么问用户: procedure TMainForm.WMGetPassword(var Msg: TMessage);var Password: String;begin if QueryPassword(Password) then // fu 我想要求用户输入密码.由于密码有时需要在与运行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;
总结

以上是内存溢出为你收集整理的string – 询问用户并将消息发送回消息接收器全部内容,希望文章能够帮你解决string – 询问用户并将消息发送回消息接收器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1266735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存