Я использую следующую процедуру, чтобы поместить результат из команд DOS в TMemo
:Moving полной информации в консоли TMemo
procedure RunDosInMemo(DosApp: String; AMemo: TMemo);
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe, WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do begin
nlength := SizeOf(TSecurityAttributes) ;
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,@Security, 0) then begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start) ;
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar(DosApp),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
then
begin
repeat
Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 200);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
repeat
BytesRead := 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
AMemo.Text := AMemo.text + String(Buffer);
until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Затем я использую его с копией netsh.exe
, чтобы получить список беспроводных сигналов и MAC-адреса:
RunDosInMemo('C:\Edge LR\netsh.exe wlan show networks mode=Bssid', Memo3);
Но это показывает только первые 9 беспроводных сигналов из списка. Когда я запускаю его непосредственно на консоли, он показывает полный список со всеми беспроводными сигналами и спецификациями.
У кого-нибудь есть идея, как это решить?
ли вы попробовать 'AMemo.Lines.Add (String (буфер))'? – Sami
Хотя @Remy находится в своем ответе ниже, я думаю, что стоит подумать о том, чтобы не изобретать колесо. Как я упоминал в своем ответе дальше, вы могли бы просто решить общую проблему, используя функцию Execute в модуле JCLSysUtils, написанную командой JEDI. Он очень прост в использовании и решает * все * технические проблемы и проблемы, с которыми вы сталкиваетесь (используя трубы и потоки и т. Д.) - может быть, это не так весело :-) –