사용자에게 암호를 입력하도록 요청하고 싶습니다. VCL이 실행되는 주 스레드와 다른 스레드에서 암호가 필요한 경우가 있으므로 주 창에 메시지를 보내고 암호를 요청했습니다. 그런 다음 주 창에 사용자에게 묻습니다.사용자에게 질문하고 응답을 메시지 수신기에 다시 보내십시오.
I는 사용자에게 어떻게 :
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
나중에 비어 : 내가 메인 창을 요청하는 방법
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;
. 내가 도대체 뭘 잘못하고있는 겁니까?
WMGetPassword에서 Msg.wParam의 유형은 무엇입니까 : 여기
포인터를 포함하지 않는 다른 방법을 무엇입니까? 그것을 PChar에 캐스팅해야합니까? –Msg.wParam도 정수, Msg.lParam입니다. – rollstuhlfahrer
@rollstuhlfahrer, 아니요, Msg.wParam은'WPARAM'이고 Msg.lParam은'LPARAM' 유형이며이 방법으로 그들은 형변환되어야합니다. 이 매개 변수가 'Integer (x)'로 유형 변환 된 메시지 전송에 대해 인터넷의 많은 자습서에서 본 내용을 잊어 버리십시오. – TLama