0 / 0 / 0
Регистрация: 05.07.2007
Сообщений: 102
1

Shell и другие способы

02.12.2007, 11:46. Показов 61627. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В хелпе по Shell написано:
In other environments, after Shell starts a program, LotusScript continues to execute the script without waiting to make sure the program has completed. You cannot be sure that a program started by Shell has finyshed running before the rest of your script is executed.

А как быть если мне надо запустить внешнюю программу, дождаться ее завершения и только после этого продолжать работу моего Lotus Script ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2007, 11:46
Ответы с готовыми решениями:

Collision2d или другие способы существуют?
Добрый вечер. Возникла проблема, я хочу сделать чтобы при столкновении персонажа с объектом он...

While(cin >> x) или подскажите другие способы заполнения вектора
Читаю Страуструпа. Ну и естественно делаю упражнения. И вот дошел до 5 главы, где понадобилась его...

Способы копирования файлов и папок в другие папки и носители
Срочно нужны! больше 20 способов! Пожалуйста!

Подключение и работа в Glut или другие способы простенькой графики
Не могу никак использовать glut и откомпилить найденный в интернете код #include...

29
Toto
06.10.2009, 14:02 21
Author24 — интернет-сервис помощи студентам
Скажите пожалуйста, а как определить окончание завершения уже запущенной задачи ?

И еще: если вызываю калькулятор или блокнот, то все работает, но строка :

ReturnCode = WShell.Run("C:\Program Files\PDFCreator\PDFCreator.exe", 1, True)

выдает ошибку
Tyo
06.10.2009, 14:57 22
Цитата Сообщение от Tata
Скажите пожалуйста, а как определить окончание завершения уже запущенной задачи ?
Например так. Получить хэндл интересующего процесса и выполнить на нём WaitForSingleObject.
Для этого перебираем все активные процессы. Для каждого процесса перебираем загруженные исполняемые модули (exe, dll), в поисках интересующего exe-шника (процессов может оказаться более одного). И для интересующих процессов выполняем WaitForSingleObject или WaitForMultipleObjects. Пример перебора процессов и модулей из MSDN на C++:


Код
void PrintProcessNameAndID( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

// Get a handle to the process.

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );

// Get the process name.

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}

// Print the process name and identifier.

_tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID );

CloseHandle( hProcess );
}

void main( )
{
// Get the list of process identifiers.

DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;

// Calculate how many process identifiers were returned.

cProcesses = cbNeeded / sizeof(DWORD);

// Print the name and process identifier for each process.

for ( i = 0; i < cProcesses; i++ )
PrintProcessNameAndID( aProcesses[i] );
}
Toto
06.10.2009, 16:07 23
Я пишу на Lotus Script, который близок к Vision Basic. C СИ++, к сожалению, не работала.
Возможно ли переписать данный код под Vision Basic ?
Tyo
06.10.2009, 16:14 24
Ну я и подразумевал, что код преобразуете в LotusScript через Declare. К сожелению, у меня сейчас нет на это времени. Может, кто ещё поможет.
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
06.10.2009, 17:11 25
можно рапнуть код под LS2J:
http://beradrian.wordpress.com/2008/11/03/...s-exit-in-java/

с нитями вопрос... (как их Нотес разруливает)
0
Tyo
06.10.2009, 17:22 26
Цитата Сообщение от lmike
можно рапнуть код под LS2J:
Тут тоже детектится дочерний подпроцесс. А вопрос в детектировании завершённости внешнего независимого "ужу запущенного".
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
06.10.2009, 17:35 27
Цитата Сообщение от TIA
Тут тоже детектится дочерний подпроцесс. А вопрос в детектировании завершённости внешнего независимого "ужу запущенного".
http://stackoverflow.com/questions/54686/h...ocess-with-java
0
0 / 0 / 0
Регистрация: 15.09.2006
Сообщений: 99
06.10.2009, 18:00 28
на самом деле вопрос довольно сложный, единого способо для любых приложений несуществует. Поведение может быть совершенно различным.
Когда я решал такую задачу, я делал проверки по нескольким возможным направлениям
Это и CreateProcessA с последующей проверкой по PID, или по заголовку окна (GetWindow) и даже (если работа с известным файлом) по монопольному открытию этого файла, если возможно то закладывал работу через COM (хотя некоторые тут его "готовить не умеют")

Просто как дополнение к выше сказаному в форуме, хотел заметить возможность поиска приложения по заголовку окна, там обычно имя файла с которым работаете светится...
что-то типа этого:

Код
Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (Byval Hwnd As Long, Byval lpClassname As String, Byval nMaxCount As Long) As Long
Declare Function apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Long
Declare Function apiGetWindow Lib "user32" Alias "GetWindow" (Byval Hwnd As Long, Byval wCmd As Long) As Long
Declare Function apiGetWindowLong Lib "user32" Alias "GetWindowLongA" (Byval Hwnd As Long, Byval nIndex As Long) As Long
Declare Function apiGetWindowText Lib "user32" Alias "GetWindowTextA" (Byval Hwnd As Long, Byval lpString As String, Byval aint As Long) As Long

Код
    Private Function fEnumWindows(PhWnd As Long, Find As String) As Long
Dim hWnd As Long, hWndLen As Long
Dim hWndStyle As Long, strCaption As String

hWnd = apiGetWindow(PhWnd, mcGWCHILD)
Do While Not hWnd = 0
strCaption = fGetCaption(hWnd)
If Len(strCaption) > 0 Then
hWndStyle = apiGetWindowLong(hWnd, mcGWLSTYLE)
If hWndStyle And mcWSVISIBLE Then
Capt$ = Ucase(fGetCaption(hWnd))
If Instr(Capt$, Ucase(Find)) <> 0 Then
Code%=0
For i%=0 To hWndCount-1
If hWndOld(i%)=hWnd Then Code%=1
Next
If Code%=0 Then fEnumWindows = hWnd
End If
End If
End If
ChildEnumWindow& = fEnumWindows(hWnd, Find)
If ChildEnumWindow& <>0 Then fEnumWindows = ChildEnumWindow&
hWnd = apiGetWindow(hWnd, mcGWHWNDNEXT)
Loop
End Function
Если результат <>0 то приложение еще запущенно

Кстати при проверки по PID, после запуска и перед проверкой делал задержку, поскольку приложение может зпустится передать инстанс в другую копию, и PID сначало вроде есть, а потом нет... :(
примерно так...

Код
        Dim StartInf As STARTUPINFO
StartInf.cb = Len ( StartInf )
RetVal = CreateProcessA ( 0&, RunProg , 0& , 0& , 1&, NORMAL_PRIORITY_CLASS , 0& , 0& , StartInf , ProcessInfo )
PID = ProcessInfo.dwProcessId

RetVal = CloseHandle ( ProcessInfo.hProcess )
RetVal = CloseHandle ( ProcessInfo.hThread )
Sleep 1 потому как если проверять сразу, PID может быть еще жив....
tmpH&=OpenProcess(PROCESS_QUERY_INFORMATION, 0&, PID)
If tmpH& <> 0& Then
проверять будем по PID
Else
проверять будем по "WindowCaption"
End If
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
06.10.2009, 18:41 29
общую логика проверки приложения на запущенность можно свести к нескольким подходам:
-получение идентификатора процесса
-получение имени процесса

эти вещи платформенно не зависимы и для их осуществления есть утилиты (в составе ОС)
для виндозы - tasklist.exe, с параметрами
для *никс - ps
вызовы апи, данном случае (ИМХО) излишни...
а проги могут вызывать и сами шел, а далее форкать процессы и много ещё чего
потому фильтровать нужно еще и по времени запуска (у tasklist я не помню такой опции)
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
07.10.2009, 13:33 30
да, вот дополнение...
обычно (как мне кажется :lol: ) вызов внешних программ связан с открытием к-л файлов (для обработки)
вот обнаружение процесс, кот. этот файл держит - может служить индикатором работы программы
в никсах - это lsof
в винде (начиная с Хрюши) OpenFiles
ежели ниже хрюши - надо ставить процесэксплорер http://technet.microsoft.com/ru-ru/sysinte...s/bb896653.aspx Руссиновича
ныне, мсявые его купили
http://en.wikipedia.org/wiki/Sysinternals
0
07.10.2009, 13:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2009, 13:33
Помогаю со студенческими работами здесь

Remote Shell и Local Shell для Windows
Привет всем. Хочу научиться писать Local Shell и Remote Shell код на masm. Для начало хочу с...

Какие способы самые удобные/рациональные способы регистрации ошибок есть?
Задался вопросом, а как регистрировать ошибки? При этом чтобы и выглядело это красиво, и понятно...

Вопрос по функции Shell (Dim RetVal RetVal = Shell('rar a tmp*.*', vbHide) )
Я с помощью Shell вызываю архиватор rar: Dim RetVal RetVal = Shell('rar a tmp*.*', vbHide)Вопрос:...

Другие ссылки на другие сайты, расположенные на основном сайте
вопрос начинающих b-( спасайте могут ли информативные ссылки на другие сайты, расположенные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru