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(&execInfo, sizeof(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.hProcess, INFINITE);
}
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.