Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Problema con ShellExecute

Hola amigos tengo una aplicación de consola que usa parámetros de entrada para hacer ciertas cosas. Si hago así por consola:
Código:
pfdtool.exe -g BLUS30270 -d "C:\PS3\SAVEDATA\BLUS3027010AE" DATA0.DAT
Funciona perfectamente pero si hago eso con ShellExecute en C++Builder asi:
Código PHP:
AnsiString directorio ExtractFilePath(OpenDialog1->FileName); 
directorio=directorio.SubString(1,directorio.Length()-1); 
AnsiString parametros " -g BLUS30270 -d \"" directorio "\"  DATA0.DAT"
ShellExecute(NULL
             
NULL
             
"pfdtool.exe"
             
parametros.c_str(), 
             
NULL
             
SW_HIDE); 
No hace nada aunque el parámetro es idéntico.
¿Que hago mal con ShellExecute?
Responder Con Cita
  #2  
Antiguo 16-11-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Seguramente, al ser C, tendrá que escribir "\\" en las barras
Responder Con Cita
  #3  
Antiguo 16-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Solucionado. El problema estaba en que tenia que indicarle el directorio de trabajo. El resto estaba bien.
El problema ahora es que esto no me sirve porque tengo que hacer varias operaciones encadenadas y para eso tengo que esperar que el programa termine una tarea para ejecutarlo de nuevo con otra tarea y asi. La solucion que he encontrado es con ShellExecuteEx el cual me permite esperar a que el proceso termine y luego seguir la ejecucion de mi proceso pero esto me congela mi proceso con lo que decidí meter esa parte en un hilo para que espere el hilo y no mi proceso pero ahora me encuentro con que al esperar que el hilo termine tambien me congela el proceso. Esto es lo que tengo:

Lo que se ejecuta al crearse el hilo:
Código PHP:
void __fastcall ThreadPfdtool::Execute()
{
    
//---- Place thread code here ----
    
SHELLEXECUTEINFO execInfo;

    
ZeroMemory(&execInfosizeof(SHELLEXECUTEINFO));

    
// Llenamos la estructura
    
execInfo.cbSize sizeof(SHELLEXECUTEINFO);
    
execInfo.fMask SEE_MASK_FLAG_DDEWAIT SEE_MASK_FLAG_NO_UI SEE_MASK_NOCLOSEPROCESS;
    
execInfo.lpVerb "open";
    
execInfo.lpFile AnsiString(PathPfdtool Nombre).c_str();
    
execInfo.lpParameters Parametros.c_str();
    
execInfo.lpDirectory  PathPfdtool.c_str();
    
execInfo.nShow SW_HIDE;
    
execInfo.hInstApp 0;

    
// Lanzamos el archivo
    
ShellExecuteEx(&execInfo);

    
// Verificamos que no hayan errores
    
if ((int)execInfo.hInstApp <= 32)
    {
        if ((int)
execInfo.hInstApp == SE_ERR_NOASSOC)
            
MessageBox(NULL,
                       
"No existe una aplicación asociada \na la extensión del archivo",
                       
"Error",
                       
MB_ICONERROR);
 
        
MessageBox(NULL,
                   
"No se ha podido ejecutar el archivo",
                   
"Error",
                   
MB_ICONERROR);
    }

    
// Esperamos a que termine el proceso
    
WaitForSingleObject(execInfo.hProcessINFINITE);

Una de las llamadas desde una funcion del formulario:
Código PHP:
void TForm1::Encriptar()
{
    
//Para encriptar
    
NombreArchivoData ExtractFileName(OpenDialog1->FileName);
    
PathData OpenDialog1->FileName.SubString(1,ExtractFilePath(OpenDialog1->FileName).Length()-1);
    
Parametros " -g " GameSettingSet " -e \"" PathData "\" " NombreArchivoData;

    
//Ejecuto el programa pfdtool con los parametros
    
ThreadPfdtool *pfdtool= new ThreadPfdtool(false,PathHerramienta,Parametros,NombreHerramienta);
    
pfdtool->WaitFor();
    
ListBoxLog->Items->Add("Se ha encriptado el archivo");
    
ButtonParchear->Enabled=false;

El problema como dije es que primero desencripto, luego modifico, y por ultimo encripto. Para desencriptar creo un hilo y espero que termine y para encriptar lo mismo y tengo que esperar a que uno termine para poder crear el segundo ya que trabajan con el mismo archivo que ademas entre medio modifico.
Responder Con Cita
  #4  
Antiguo 16-11-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

¿ Y no te serviría usar la función CreateProcess ?

Un ejemplo:
Código PHP:
void createProcesswaitingcharfullExefilename )
{
  
PROCESS_INFORMATION PI;
  
STARTUPINFO SI;

  
ZeroMemory( &SIsizeofSI ) );
  
SI.cb sizeofSI );

  if( 
CreateProcessNULLfullExefilenameNULLNULLfalse
        
NORMAL_PRIORITY_CLASSNULLNULL, &SI, &PI ) )
    
WaitForSingleObjectPI.hThreadINFINITE );

  
CloseHandlePI.hProcess );
  
CloseHandlePI.hThread );

Llamada ejemplo:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
createProcesswaiting"C:\\WINDOWS\\SYSTEM32\\CALC.EXE" );
  
createProcesswaiting"C:\\WINDOWS\\NOTEPAD.EXE" );
  
createProcesswaiting"C:\\WINDOWS\\REGEDIT.EXE" );
  
//...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 16-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Tengo dos dudas sobre lo que me dices.
1.Esta linea:
Código PHP:
WaitForSingleObjectPI.hThreadINFINITE ); 
¿No haria como WaitFor y congelaria el hilo desde el que lo llame? en este caso seria el del form.

2.¿Como le paso con CreateProcess los parametros para que se ejecute con parametros?
Responder Con Cita
  #6  
Antiguo 16-11-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

1. Eso dependerá de como estes implementando los hilos, pero quitando esa línea no se esperará a que termine el proceso creado para continuar.

2. Sería: "exefile.exe arg1 arg2 ... argN", por ejemplo:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
createProcesswaiting"C:\\WINDOWS\\NOTEPAD.EXE C:\\WINDOWS\\WIN.INI" );
  ...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



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
Problema con ShellExecute Angel Vicente API de Windows 3 02-06-2008 11:34:07
Problema con ShellExecute() kagua77 C++ Builder 3 17-04-2008 01:19:00
problema con el ShellExecute nogoncar C++ Builder 5 10-07-2007 10:42:44
Problema con ShellExecute Walterdf Varios 9 18-11-2005 20:44:19
Problema con ShellExecute hector_etv Varios 1 07-08-2005 04:11:47


La franja horaria es GMT +2. Ahora son las 05:38:55.


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