Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   funcion para invocar comandos con fallos (https://www.clubdelphi.com/foros/showthread.php?t=91714)

Snaked 05-04-2017 22:43:03

funcion para invocar comandos con fallos
 
necesito ayuda para esta funcion....sirve para invocar comandos de consola de windows pero sin que se muestre la ventana negra esa tan fea

la cosa es que lo he convertido de un codigo delphi y no he tenido mucha suerte

a ver si algun manitas puede arreglarmela para que funcione (creo que me he hecho el lio con los ifs y el do while repeat ese

Código PHP:

bool IsWinNT(void)
{
OSVERSIONINFO *OSV;

OSV->dwOSVersionInfoSize sizeof(OSV);
GetVersionEx(OSV);
int Result OSV->dwPlatformId;
return(
Result);
}

void CmdExec(AnsiString Cmd)
{
 
char Buffer[4096];
 
STARTUPINFO si;
 
SECURITY_ATTRIBUTES sa;
 
SECURITY_DESCRIPTOR sd;
 
PROCESS_INFORMATION pi;
THandle newstdinnewstdoutread_stdoutwrite_stdin ;
unsigned int exitcod;
unsigned int bread;
unsigned int avail;

int Result 0;
if (
IsWinNT)
{
InitializeSecurityDescriptor(&sdSECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sdtrueNULLfalse);
sa.lpSecurityDescriptor = &sd;
}
else 
sa.lpSecurityDescriptor NULL;
sa.nLength sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle true;
  if (
CreatePipe(newstdinwrite_stdin, &sa0))
   {
     if (
CreatePipe(read_stdoutnewstdout, &sa0))
      {
         
GetStartupInfo(&si);

          
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
          
si.wShowWindow SW_HIDE;
           
si.hStdOutput newstdout;
           
si.hStdError newstdout;
           
si.hStdInput newstdin;

           
Fillchar(Buffersizeof(Buffer), 0);
             
GetEnvironmentVariable('COMSPEC', &Buffersizeof(Buffer) - 1);
         
StrCat(&Buffer,PChar(' /c ' Cmd));
      }
      if (
CreateProcess(NULL, &BufferNULLNULLtrueCREATE_NEW_CONSOLENULLNULLsipi)
      {
          while(
exitcod != STILL_ACTIVE && bread 0)
             {
               
PeekNamedPipe(read_stdout, @BufferSizeOf(Buffer) - 1, @bread, @availnil);
                if 
bread 0 then
                
{
                   
Fillchar(BufferSizeOf(Buffer), 0);
                   
ReadFile(read_stdoutBufferbreadbreadnil);
                   
Result Result String(PChar(&Buffer));
                 }
             }

Application.ProcessMessages;
GetExitCodeProcess(pi.hProcessexitcod);
      }
CloseHandle(read_stdout);
CloseHandle(newstdout);
end;
CloseHandle(newstdin);
CloseHandle(write_stdin);
    }
   } 


Snaked 05-04-2017 22:49:41

vale, no es necesario ya

lo he solucionado con

Código PHP:

ShellExecute(0NULL"cmd.exe""NETS.bat"NULLSW_HIDE); 


Snaked 06-04-2017 12:08:30

alguna idea para finalizar el proceso de consola en memoria una vez haya terminado???

tengo esto puesto pero parece que no funciona correctamente porque no finaliza la consola

Código PHP:

HWnd h 0

FindWindow(NULL"cmd.exe");
  if (
!= 0)
   {
    
ShowMessage("Cerrando CMD Line");
    
PostMessage(hWM_CLOSE00);
   } 


escafandra 06-04-2017 20:53:25

Cita:

Empezado por Snaked (Mensaje 515222)
necesito ayuda para esta funcion....sirve para invocar comandos de consola de windows pero sin que se muestre la ventana negra esa tan fea

la cosa es que lo he convertido de un codigo delphi y no he tenido mucha suerte

a ver si algun manitas puede arreglarmela para que funcione (creo que me he hecho el lio con los ifs y el do while repeat ese

Código PHP:

bool IsWinNT(void)
{
OSVERSIONINFO *OSV;

OSV->dwOSVersionInfoSize sizeof(OSV);
GetVersionEx(OSV);
int Result OSV->dwPlatformId;
return(
Result);
}

void CmdExec(AnsiString Cmd)
{
 
char Buffer[4096];
 
STARTUPINFO si;
 
SECURITY_ATTRIBUTES sa;
 
SECURITY_DESCRIPTOR sd;
 
PROCESS_INFORMATION pi;
THandle newstdinnewstdoutread_stdoutwrite_stdin ;
unsigned int exitcod;
unsigned int bread;
unsigned int avail;

int Result 0;
if (
IsWinNT)
{
InitializeSecurityDescriptor(&sdSECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sdtrueNULLfalse);
sa.lpSecurityDescriptor = &sd;
}
else 
sa.lpSecurityDescriptor NULL;
sa.nLength sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle true;
  if (
CreatePipe(newstdinwrite_stdin, &sa0))
   {
     if (
CreatePipe(read_stdoutnewstdout, &sa0))
      {
         
GetStartupInfo(&si);

          
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
          
si.wShowWindow SW_HIDE;
           
si.hStdOutput newstdout;
           
si.hStdError newstdout;
           
si.hStdInput newstdin;

           
Fillchar(Buffersizeof(Buffer), 0);
             
GetEnvironmentVariable('COMSPEC', &Buffersizeof(Buffer) - 1);
         
StrCat(&Buffer,PChar(' /c ' Cmd));
      }
      if (
CreateProcess(NULL, &BufferNULLNULLtrueCREATE_NEW_CONSOLENULLNULLsipi)
      {
          while(
exitcod != STILL_ACTIVE && bread 0)
             {
               
PeekNamedPipe(read_stdout, @BufferSizeOf(Buffer) - 1, @bread, @availnil);
                if 
bread 0 then
                
{
                   
Fillchar(BufferSizeOf(Buffer), 0);
                   
ReadFile(read_stdoutBufferbreadbreadnil);
                   
Result Result String(PChar(&Buffer));
                 }
             }

Application.ProcessMessages;
GetExitCodeProcess(pi.hProcessexitcod);
      }
CloseHandle(read_stdout);
CloseHandle(newstdout);
end;
CloseHandle(newstdin);
CloseHandle(write_stdin);
    }
   } 


Y partiendo de una función publicada en el mismo foro, ¿no crees que hubiese sido elegante citar la fuente y su autor? Ejecutar comando y capturar su salida (Domingo Seoane)

Saludos.

Snaked 06-04-2017 22:36:04

querido escafandra..... yo con darle las gracias a dios por poder respirar creo que cumplo como creyente fiel......

(mira que estais quisquillosos X-D)

pero en fin, ya no os molesto mas no vaya a ser que os de un acceso de furia porque tengo tendencia a mandar a tomar por culo a la gente que me toca las pelotas cuando no hay necesidad de tocarlas

creo que no sois mi tipo de gente asi que buen viaje por la vida chicos

escafandra 06-04-2017 23:13:31

Cita:

Empezado por Snaked (Mensaje 515282)
querido escafandra..... yo con darle las gracias a dios por poder respirar creo que cumplo como creyente fiel......

(mira que estais quisquillosos X-D)

pero en fin, ya no os molesto mas no vaya a ser que os de un acceso de furia porque tengo tendencia a mandar a tomar por culo a la gente que me toca las pelotas cuando no hay necesidad de tocarlas

creo que no sois mi tipo de gente asi que buen viaje por la vida chicos

Eres de los que tienen claro que el código en los foros aparece por ciencia infusa y que está ahí para que "gente" como tu lo tome sin mirar más. Para ti no significa nada el esfuerzo de parir un trozo de código y la generosidad de compartirlo. En este caso se trata de código de seoane en este mismo foro, pero en éste otro caso has tenido la delicadeza de copiarlo de otro foro, y traerlo aquí para preguntar como traducirlo sin citar su origen, probablemente por torpeza no viste que su autor participa en ambos sitios. Se da la circunstancia que ese código es mio, y como te dije es libre pero una mínima educación exige citar su origen. Si prefieres dar las gracias a Dios por respirar me parece bien pero la educación se muestra con tus congéneres. Como dice el saber popular en mi tierra, "Es de bien nacido ser agradecido". Pero seguro que esa actitud tuya te dará muchos y buenos frutos en la vida.



Saludos.

Casimiro Notevi 07-04-2017 01:14:47

Cita:

Empezado por Snaked (Mensaje 515282)
querido escafandra..... yo con darle las gracias a dios por poder respirar creo que cumplo como creyente fiel......
(mira que estais quisquillosos X-D)
pero en fin, ya no os molesto mas no vaya a ser que os de un acceso de furia porque tengo tendencia a mandar a tomar por culo a la gente que me toca las pelotas cuando no hay necesidad de tocarlas
creo que no sois mi tipo de gente asi que buen viaje por la vida chicos

¿Esos son los modales que te enseñan tus padres, o han sido tus maestros?
Has sido baneado, que te vaya bien por la vida.

Neftali [Germán.Estévez] 07-04-2017 08:21:46

Cita:

Empezado por Snaked (Mensaje 515282)
creo que no sois mi tipo de gente asi que buen viaje por la vida chicos

Al final no somos tan diferentes, tú tampoco eres del tipo de gente que gusta por estos foros.
Buen viaje para ti también.


La franja horaria es GMT +2. Ahora son las 00:38:27.

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