HOla:
Por aca te mando un codigo que me mandaron.
Es muy practico, pero hay que ponerle atencion.
Hola.No se si es exactamente lo que quieres. Te mando un ejemplo de cómo ejecutar
una aplicación DOS desde otra Windows, y que esta ultima espere a que
termine la anterior antes de seguir.
Para hacer eso, se escriben dos funciones:
- Shell, una función que ejecuta la aplicación DOS y devuelve el número de
proceso para controlar el estado de la ejecución.
- ExecCmdNoFocus, es una función que llama a Shell y se mantiene en un
bucle hasta que finaliza la aplicación DOS.
//--------------------------------------------------------------------------
----------------------------------------------------------
DWORD __fastcall Shell(LPTSTR PathName, LPTSTR lpInitialDir, WORD
WindowStyle)
{
// Parametros: PathName = ruta y nombre de la aplicación DOS
// lpInitialDir = ruta de la carpeta de trabajo
// WindowStyle = Estilo de la ventana en que se ejecuta
la app. DOS
STARTUPINFO si;
PROCESS_INFORMATION pi;
LPVOID lpvEnv;
// Get a pointer to the environment block.
lpvEnv = GetEnvironmentStrings();
// Variable strings are separated by NULL byte, and the block is
// terminated by a NULL byte.
ZeroMemory(&si, sizeof(STARTUPINFO));
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = WindowStyle;
si.cb = sizeof(si);
CreateProcess(NULL, PathName, NULL, NULL, false, 0, lpvEnv, lpInitialDir,
&si, &pi);
return (pi.dwProcessId);
}
//--------------------------------------------------------------------------
-
//Un procedimiento para ejecutar y esperar a que termine
void ExecCmdNoFocus(LPTSTR CmdLine)
{
// Parametro: CmdLine = ruta y nombre de la aplicación DOS.
//Esperar a que un proceso termine,
//la ventana se mostrará minimizada sin foco
HANDLE hProcess;
DWORD RetVal;
//The next line launches CmdLine as icon,
//captures process ID
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
Shell(CmdLine, NULL, SW_SHOWMINNOACTIVE));
do
{
//Get the status of the process
GetExitCodeProcess(hProcess, &RetVal);
//Sleep command recommended as well
//as DoEvents
Application->ProcessMessages();
Sleep(100);
}
//Loop while the process is active
while (RetVal == STILL_ACTIVE);
}
//--------------------------------------------------------------------------
-
Para ejecutarlo, genera una nueva aplicación con un TButton (Button1) y un
TMemo (Memo1)
//--------------------------------------------------------------------------
---
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString sParams;
sParams = "command /c dir c:\\*.* /s > c:\\dir.txt";
// Si se prueba en Windows NT / 2000, poner
// sParams = "cmd /c dir c:\\*.* /s > c:\\dir.txt";
Screen->Cursor = crHourGlass;
ExecCmdNoFocus(sParams.c_str());
Screen->Cursor = crDefault;
Memo1->Lines->LoadFromFile("c:\\dir.txt");
}
//--------------------------------------------------------------------------
-
Jorge Miquélez Echegaray
jorge.miquelez@avanzit.com