Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #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
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
cantidad de registros devueltos por adoquery ozegarra OOP 2 16-01-2008 16:39:43
delphi + firebird 2.0.3 + MDO = 0 registros devueltos joselitoman Conexión con bases de datos 6 29-10-2007 02:33:34
Consulta con campos devueltos NULL FGarcia Tablas planas 4 10-09-2007 23:46:12
¿Record counta el total de registros devueltos? rafita SQL 2 15-09-2006 12:41:52
Identificar emails erroneos o devueltos Descendents Internet 0 20-11-2003 09:53:47


La franja horaria es GMT +2. Ahora son las 00:06:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi