Попробуйте вот это.
X++:
static void shellExecuteWait(str commandLine, int _waitTime = -1, int cmdShow = 4)
{
// Ожидание завершения работы приложения commandLine.
#WinAPI
#DEFINE.STATUS_TIMEOUT(0x00000102)
Dll kernel32 = new Dll("kernel32.dll");
DllFunction createProcess = new DllFunction(kernel32, "CreateProcessA");
DllFunction waitForSingleObject = new DllFunction(kernel32, "WaitForSingleObject");
DllFunction closeHandle = new DllFunction(kernel32, "CloseHandle");
DllFunction terminateProcess = new DllFunction(kernel32, "TerminateProcess");
Binary strartupInformation = new binary(68);
Binary processInformation = new binary(16);
int hProcess;
createProcess.returns(ExtTypes:: DWORD);
createProcess.arg(ExtTypes:: DWORD, ExtTypes:: STRING,
ExtTypes:: DWORD, ExtTypes:: DWORD,
ExtTypes:: DWORD, ExtTypes:: DWORD,
ExtTypes:: DWORD, ExtTypes:: DWORD,
ExtTypes:: POINTER, ExtTypes:: POINTER);
waitForSingleObject.returns(ExtTypes:: DWORD);
waitForSingleObject.arg(ExtTypes:: DWORD, ExtTypes:: DWORD);
closeHandle.returns(ExtTypes:: DWORD);
closeHandle.arg(ExtTypes:: DWORD);
terminateProcess.returns(ExtTypes:: DWord);
terminateProcess.arg(ExtTypes:: DWord, ExtTypes:: DWord);
strartupInformation.dWord(44, cmdShow);
if (!createProcess.call(0, commandLine, 0, 0, 0, 0, 0, 0, strartupInformation, processInformation))
{
throw error(strfmt("Ошибка при запуске приложения \"%1\"", commandLine));
}
hProcess = processInformation.dWord(0);
if (waitForSingleObject.call(hProcess, _waitTime) == #STATUS_TIMEOUT)
{
terminateProcess.call(hProcess, 1);
throw error(strfmt("Приложение \"%1\" закрыто, так как не завершилось за отведенное ему время", commandLine));
}
closeHandle.call(hProcess);
}