¡De nada!
Me alegra en verdad haberte podido ayudar.
Por lo visto esta sentencia
Código Delphi
[-]ReadFile(read_stdout, Buffer, bread, bread, nil);
lee caracteres ANSI (de un byte) y los mete a la variable Buffer. Esta tiene la declaración
Código Delphi
[-]Buffer: array[0..4096] of Char;
, que en su momento era una matriz de 4097 bytes. Pero ahora el tipo Char es Unicode y tiene un tamaño de dos bytes, por lo que la matriz duplica su tamaño en las versiones modernas de Delphi. Este cambio no parece dar problema con el resto de las funciones donde se utiliza la variable Buffer. GetEnvironmentVariable, por ejemplo, fue en su momento actualizada para Unicode. Sin embargo la lectura con ReadFile de lo que arroja el comando ejecutado depende de cómo trabaje la consola de Windows (al parecer sigue siendo ANSI).
Así, cuando se realiza la concatenación
Código Delphi
[-]Result:= Result + String(PChar(@Buffer));
en Delphi 2009 o superior, se toman los bytes de Buffer de dos en dos, siendo cada par, es decir, cada Char moderno, interpretado como un carácter Unicode.
Digamos que en un String ANSI 'Hola', donde el valor como Byte de esos cuatro caracteres es 72, 111, 108 y 97, unir por pares dichos valores nos daría (por su conformación binaria) los valores Word 28488 (111 desplazado ocho bits a la izquierda más 72) y 24940 (97 desplazado ocho bits a la izquierda más 108). Si buscamos en Google los caracteres Unicode de valor decimal 28488 y 24940, aparece que estos son
潈 y
慬, respectivamente. No tengo la más remota idea de qué significan; no vayan a decir
hola de esa manera cuando viajen por oriente.
El efecto del problema que se producía puede ser comprobado con un código como este:
Código Delphi
[-]
procedure TfmMain.Button1Click(Sender: TObject);
Var
A :ANSIString;
begin
A := 'Hola';
ShowMessage (PChar (A)); end;
Me gustaría hacer un reconocimiento al autor de la útil función CmdExec,
Domingo Seoane. Tengo buenos recuerdos de él como miembro de este club. Durante años hizo innumerables aportaciones técnicas en materia de Delphi que hasta la fecha siguen sirviendo a programadores como JoAnCa. Mi respeto absoluto para Domingo, ojalá lo leamos por acá nuevamente.
Un abrazo
caracterizado.
Al González.