Hola, si lo que quieres es tener acceso a la salida del programa y que este no se vea al ejecutarse, puedes usar lo siguiente:- Añadimos al Form un TButton (Button1) y un TMemo (Memo1), y ponemos el siguiente código en el OnClick del botón:
// Aquí ponemos el programa que queremos ejecutar
String sPrograma = "bcc32.exe";
SECURITY_ATTRIBUTES sa;
HANDLE hReadPipe, hWritePipe;
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
CreatePipe(&hReadPipe, &hWritePipe, &sa, 2500000);
if (hReadPipe == INVALID_HANDLE_VALUE
| | hWritePipe == INVALID_HANDLE_VALUE)
{
ShowMessage("Error :: CreatePipe");
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; // Oculto
si.hStdOutput = hWritePipe; // Asignamos la salida del programa al Pipe
// Ejecuta el programa
bool bRet = CreateProcess(0,sPrograma.c_str(),0,0,true,0,0,0,&si,&pi);
if (!bRet)
{
ShowMessage("Error :: CreateProcess");
return;
}
// Espera a que termine de ejecutarse el programa
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, 30000);
// Copia en el Memo la salida del programa
char Buffer[4000];
DWORD dwRead;
bool bHecho = false;
Memo1->Clear();
while (!bHecho)
{
ZeroMemory(Buffer, sizeof(Buffer));
ReadFile(hReadPipe, &Buffer, sizeof(Buffer), &dwRead, NULL);
Memo1->Lines->Add(Buffer);
if (dwRead < 4000)
bHecho = true;
}
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(pi.hProcess);
Más información en el directorio de ejemplos del C++Builder: ...\Examples\WinTools
Saludos.
_Leo