![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Salida de msdos en delhpi 2010
Me gustaria saber si alguien me podria contestar como trasladar una funcion que tengo para delphi 2007 al nuevo delphi 2010, al funcion devuelve la salida de un comando ejecutado en ms-dos en delphi 2007 devuelve bien el resultado pero al ejecutarlo en delphi 2010 me devuelve basura, la funcion es esta:
Código:
function ejecutarComando (comando : string) : string; var Buffer: array[0..4096] of Char; si: STARTUPINFO; sa: SECURITY_ATTRIBUTES; sd: SECURITY_DESCRIPTOR; pi: PROCESS_INFORMATION; newstdin, newstdout, read_stdout, write_stdin: THandle; exitcod, bread, avail: Cardinal; begin Result:= ''; if Win32Platform = VER_PLATFORM_WIN32_NT then begin InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@sd, true, nil, false); sa.lpSecurityDescriptor := @sd; end else sa.lpSecurityDescriptor := nil; sa.nLength := sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle := TRUE; if CreatePipe(newstdin, write_stdin, @sa, 0) then begin if CreatePipe(read_stdout, newstdout, @sa, 0) then begin GetStartupInfo(si); with si do begin dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; wShowWindow := SW_HIDE; hStdOutput := newstdout; hStdError := newstdout; hStdInput := newstdin; end; Fillchar(Buffer, SizeOf(Buffer), 0); GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1); StrCat(@Buffer,PChar(' /c ' + comando)); if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then begin repeat PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil); if bread > 0 then begin Fillchar(Buffer, SizeOf(Buffer), 0); ReadFile(read_stdout, Buffer, bread, bread, nil); Result:= Result + String(PChar(@Buffer)); end; Application.ProcessMessages; GetExitCodeProcess(pi.hProcess, exitcod); until (exitcod <> STILL_ACTIVE) and (bread = 0); end; CloseHandle(read_stdout); CloseHandle(newstdout); end; CloseHandle(newstdin); CloseHandle(write_stdin); end; end; |
#2
|
||||
|
||||
Bueno, no tengo D2010, pero se me ocurre que el problema está en el buffer, que es un arreglo de Char. El tipo Char en Delphi 2010 es un WideChar de antes, es decir Unicode. Yo probaría poniendo un AnsiChar.
Lo mismo haría con cualquier string, pchar o similar. Espero te sirva. Saludongos. |
#3
|
||||
|
||||
Bueno, lo ideal sería convertir todas las llamadas a WideChar, pero me ha sido más fácil hacer lo contrario, convertirlas a AnsiChar.
Pruebalo bien, solo está muy ligeramente probado. Un saludo.
|
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Exportar reporte a pdf de crystal desde delhpi | richy08 | Varios | 2 | 28-11-2008 17:07:40 |
Conectar delhpi con mysql | richy08 | Conexión con bases de datos | 4 | 24-04-2008 22:02:05 |
Ayuda con Rave Report 6 y Delhpi 2005 | MaSSaKKre | Impresión | 2 | 06-03-2008 18:23:28 |
usar el data link file en delhpi | richy08 | Varios | 0 | 07-11-2007 17:30:34 |
Donde ubico al que hace los programas delhpi que trae de ejemplo | jpardo25cl | Varios | 1 | 29-11-2006 16:24:09 |
![]() |
|