Ver Mensaje Individual
  #1  
Antiguo 01-05-2022
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Reputación: 21
elrayo76 Va por buen camino
Comandos DOS son devueltos en idioma chino

Buenas noches a todos,

Tengo la siguiente función desarrollada (probando en Windows 10) y me devuelve a la VCL (TMemo) el resultado de la salida de comandos como caracteres chinos.

Código Delphi [-]
function ExecuteCommandCMD(aCommandLine: String; aReturnOutput: Boolean = False): String;
var
  objWindowsVersion: TWindowsVersion;
  typStartUpInfo: STARTUPINFO;
  typSecAttr: SECURITY_ATTRIBUTES;
  typSecDescrip: SECURITY_DESCRIPTOR;
  typProcInformation: PROCESS_INFORMATION;
  objNewStdIn: THandle;
  objNewStdOut: THandle;
  objReadStdOut: THandle;
  objWriteStdIn: THandle;
  carExitCode: Cardinal;
  caByteRead: Cardinal;
  carAvailable: Cardinal;
  arrBuffer: array[0..MAX_PATH] of Char;  // El tamaño puede ser cambiado según las necesidades.

begin
  Result := '';
  objWindowsVersion := TWindowsVersion.Create;

  try
    if objWindowsVersion.IsPlatformNT then
    begin
      InitializeSecurityDescriptor(@typSecDescrip, SECURITY_DESCRIPTOR_REVISION);
      SetSecurityDescriptorDacl(@typSecDescrip, True, nil, False);
      typSecAttr.lpSecurityDescriptor := @typSecDescrip;
    end
    else
      typSecAttr.lpSecurityDescriptor := nil;
  finally
    FreeAndNil(objWindowsVersion);
  end;

  typSecAttr.nLength := SizeOf(SECURITY_ATTRIBUTES);
  typSecAttr.bInheritHandle := True;

  // Crea un pipe anónimo y devuelve el manejador para la lectura y escritura en el pipe.
  if CreatePipe(objNewStdIn, objWriteStdIn, @typSecAttr, 0) then
  begin
    if CreatePipe(objReadStdOut, objNewStdOut, @typSecAttr, 0) then
    begin
      // Devuelve el contenido de la estructura 'STARTUPINFO' cuando se crea el proceso que es llamado.
      GetStartupInfo(typStartUpInfo);

      with typStartUpInfo do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_SHOW; //SW_HIDE;
        hStdOutput := objNewStdOut;
        hStdError := objNewStdOut;
        hStdInput := objNewStdIn;
      end;

      Fillchar(arrBuffer, SizeOf(arrBuffer), 0);
      // Para un detalle de las variables que se pueden leer ver:
      //   - http://docwiki.embarcadero.com/Libra...onmentVariable
      // Igualmente la función que se usa aca es la de las APIs de Windows (Windows) y no la de Delphi (SysUtils).
      GetEnvironmentVariable('COMSPEC', arrBuffer, SizeOf(arrBuffer) - 1);
      StrCat(arrBuffer, PChar(' /C ' + aCommandLine));

      // Crea un proceso y su hilo promario. El nuevo proceso corre en un contexto seguro del proceso llamado.
      if CreateProcess(nil, arrBuffer, nil, nil, True, CREATE_NEW_CONSOLE, nil, nil, typStartUpInfo, typProcInformation) then
      begin
        repeat
          // Copia los datos de un pipe con nombre o anónimo en el buffer sin eliminar lo que tiene el pipe.
          // También devuelve la información de los datos del pipe.
          PeekNamedPipe(objReadStdOut, @arrBuffer, SizeOf(arrBuffer) - 1, @caByteRead, @carAvailable, nil);

          if caByteRead > 0 then
          begin
            Fillchar(arrBuffer, SizeOf(arrBuffer), 0);
            ReadFile(objReadStdOut, arrBuffer, SizeOf(arrBuffer), caByteRead, 0);
            // Acá es donde se devuelve el resultado de lo ejecutado en la consola DOS.
            if aReturnOutput then Result := Result + #13#10 + String(arrBuffer);
          end;

          Application.ProcessMessages;
          GetExitCodeProcess(typProcInformation.hProcess, carExitCode);
        until (carExitCode <> STILL_ACTIVE) and (caByteRead = 0);
      end
      else
        MessageError(ERR_DOS_COMMAND);

      CloseHandle(objReadStdOut);
      CloseHandle(objNewStdOut);
    end;

    CloseHandle(objNewStdIn);
    CloseHandle(objWriteStdIn);
  end;
end;


No entiendo en donde tengo que corregir para que lo que devuelva sea en un idioma legible tal cual lo vemos en la ventana de comandos cunado ejecutamos algo.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita