|
![]() |
#1 |
Участник
|
Ай нид хелп. Выполнение run с третьим параметром равным "true" не ждет завершения отработки:
X++: wsh = new COM('WScript.Shell'); wsh.Run(strFmt("winrar.exe e -y -o+ %1 %2",fileName,temppath), 0, true); wsh.finalize(); fullFileName = SysTreeNode::duplicatePathDelimiters(< >); if(!winapi::fileExists_RU(fullFileName)) throw error("Нема файлка!"); Не подскажете как быть? P.S. Выполняю на Windows XP. Axapta 3.0 |
|
![]() |
#2 |
Участник
|
Попробуйте вот это.
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); } |
|
|
За это сообщение автора поблагодарили: konfet (1), tricky (1). |
![]() |
#3 |
Участник
|
Спасибо, работает.
Но только вот так X++: MyTestGlobal::shellExecuteWait(strFmt("C:\\Progra~1\\WinRAR\\WinRAR.exe e -y -o+ %1 %2",fileName,temppath)); X++: MyTestGlobal::shellExecuteWait(strFmt("WinRAR.exe e -y -o+ %1 %2",fileName,temppath)); |
|
![]() |
#4 |
Administrator
|
Цитата:
1. Предположить что Winrar всегда будет стоять в Program Files. Путь к Program Files можно определить из переменной окружения %ProgramFiles% (cmd.exe echo %ProgramFiles%). Это поможет в случае установки Windows на разные диски. 2. В реестре (Windows 2008 Server, Vista) есть ветка HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe, у которой есть значение по умолчанию - полный путь к Exe-шнику и значение Path - соответственно - путь только к каталогу. Можно проанализировать эту ветку на предмет получения пути. В общем случае - можно поискать в реестре по ключевому слову WinRAR чтобы понять где какая информация хранится. Но в случае реестра есть маленькая ложка дегтя. Структура реестра в Vista / Server 2008 немного отличается от предыдущих версий Windows и есть риски "не найти в ожидаемом месте" информацию в реестре для разных ОС.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: tricky (1). |
Теги |
shellexecute, winapi, запуск |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|