Cita:
Empezado por Flecha
A mí me tiene manía. Se niega a funcionar.
¿Podrá ser por la versión del Delphi? Yo trabajo con Delphi 6 (arcaico, sí, pero es lo que hay)
|
No, no te tiene manía, ha sido un pequeño error mio al inicializar la estructura SECURITY_ATTRIBUTES, se bebe poner a cero. El no hacerlo provoca errores erráticos en la API CreatePipe que te tomaron manía
.
Coloco el código de nuevo para dejarlo mas claro y optimizarlo un poco:
Código Delphi
[-]function DosCommand(CommandLine: String): String;
var
Buffer: array [0..4096] of char;
pipeRead, pipeWrite: THandle;
sa: SECURITY_ATTRIBUTES;
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
dwRead: DWORD;
begin
Result:= '';
GetEnvironmentVariable('COMSPEC', Buffer, sizeof(Buffer));
CommandLine:= String(Buffer) + ' /C ' + CommandLine;
ZeroMemory(@sa, sizeof(SECURITY_ATTRIBUTES));
sa.nLength:= sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle:= TRUE;
if CreatePipe(pipeRead, pipeWrite, @sa, 25*1024) then
begin
si.cb:= sizeof(STARTUPINFO);
ZeroMemory(@pi, sizeof(PROCESS_INFORMATION));
si.hStdOutput:= pipeWrite;
si.hStdError := pipeWrite;
si.hStdInput := pipeWrite;
si.dwFlags:= STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.wShowWindow:= SW_HIDE;
if CreateProcess(nil, PCHAR(CommandLine), nil, nil, TRUE, 0, nil, nil, si, pi) then
begin
CloseHandle(pi.hThread);
if WaitForSingleObject(pi.hProcess, 9000) = WAIT_OBJECT_0 then
begin
dwRead:= 0;
WriteFile(pipeWrite, '', 1, dwRead, 0);
repeat
ZeroMemory(@buffer, sizeof(buffer));
ReadFile(pipeRead, buffer, sizeof(buffer), dwRead, 0);
OemToCharBuffA(buffer, buffer, dwRead);
Result:= Result + #13 + #10 + String(buffer);
until dwRead < sizeof(buffer);
end;
CloseHandle(pi.hProcess);
end;
CloseHandle(pipeRead);
CloseHandle(pipeWrite);
end;
end;
Saludos.