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

Тема в разделе "Lotus - Программирование", создана пользователем PavelT100, 3 дек 2007.

  1. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    В хелпе по 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 finished running before the rest of your script is executed.

    А как быть если мне надо запустить внешнюю программу, дождаться ее завершения и только после этого продолжать работу моего Lotus Script ?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: PavelT100
    Надо спрашивать у программы .
    Если программа Ваша, зделайте так что бы она в файл кудато кидала информацию о завершении работы.
    Если COM - то можно обьект опрашивать.

    А вообще это делаеться с помощью Api -функций
    Сначала CreateProcess
    The CreateProcess function creates a new process and its primary thread. The new process executes the specified executable file.

    Код (Text):
    BOOL CreateProcess(

    LPCTSTR lpApplicationName,  // pointer to name of executable module
    LPTSTR lpCommandLine,   // pointer to command line string
    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // pointer to process security attributes
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // pointer to thread security attributes
    BOOL bInheritHandles,   // handle inheritance flag
    DWORD dwCreationFlags,  // creation flags
    LPVOID lpEnvironment,   // pointer to new environment block
    LPCTSTR lpCurrentDirectory, // pointer to current directory name
    LPSTARTUPINFO lpStartupInfo,    // pointer to STARTUPINFO
    LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION
    );
    а патом WaitForSingleObject
    The WaitForSingleObject function returns when one of the following occurs:

    · The specified object is in the signaled state.
    · The time-out interval elapses.

    Код (Text):
    DWORD WaitForSingleObject(

    HANDLE hHandle, // handle of object to wait for
    DWORD dwMilliseconds    // time-out interval in milliseconds
    );
    А Вот пример на Delphi
     
  3. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Вот по мотивам вызова CreateProcess из VBA попытался написать следующий код на Lotus Script.
    Но запуск калькулятора не получается, в функции RunAndWait переменная ret после вызова CreateProcess становится равна нулю, при этом и GetLastError тоже возвращает 0.
    Как CreateProcess запустить на Lotus Script ?
    Код (Text):
    Const INFINITE = &HFFFF
    'StartupInfo constants
    Public Const STARTF_FORCEOFFFEEDBACK = &H80
    Public Const STARTF_FORCEONFEEDBACK = &H40
    Public Const STARTF_RUNFULLSCREEN = &H20
    Public Const STARTF_USECOUNTCHARS = &H8
    Public Const STARTF_USEFILLATTRIBUTE = &H10
    Public Const STARTF_USEPOSITION = &H4
    Public Const STARTF_USESHOWWINDOW = &H1
    Public Const STARTF_USESIZE = &H2
    Public Const STARTF_USESTDHANDLES = &H100
    'ShowWindow constants
    Public Const SW_HIDE = 0
    Public Const SW_SHOWNORMAL = 1
    Public Const SW_SHOWMINIMIZED = 2
    Public Const SW_MAXIMIZE = 3
    Public Const SW_SHOWMAXIMIZED = 3
    Public Const SW_SHOWNOACTIVATE = 4
    Public Const SW_SHOW = 5
    Public Const SW_MINIMIZE = 6
    Public Const SW_SHOWMINNOACTIVE = 7
    Public Const SW_SHOWNA = 8
    Public Const SW_RESTORE = 9
    Public Const SW_SHOWDEFAULT = 10

    Public Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
    End Type

    Public Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
    End Type
    Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (Byval lpApplicationName As String, Byval lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, Byval bInheritHandles As Long, Byval dwCreationFlags As Long, lpEnvironment As Any, Byval lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Declare Function CloseHandle Lib "kernel32" (Byval hObject As Long) As Long
    Declare Function WaitForSingleObject Lib "kernel32" (Byval hHandle As Long, Byval dwMilliseconds As Long) As Long
    Declare Function GetLastError Lib "kernel32" () As Long


    Function RunAndWait(ComLine As String, DefaultDir As String) As Boolean
    Dim si As STARTUPINFO
    Dim pii As PROCESS_INFORMATION
    si.cb = 72
    si.wShowWindow = 1
    si.dwFlags = STARTF_USESHOWWINDOW
    Dim ret As Long
    ret = CreateProcess(0, ComLine, Byval 0&, Byval 0&, False, 0, Byval 0&, DefaultDir, si, pii)
    If ret Then
    WaitForSingleObject pii.hProcess, INFINITE
    CloseHandle pii.hProcess
    RunAndWait = True
    Exit Function
    Else
    Dim err1 As Long       
    err1 = GetLastError()
    Msgbox "LastError = " & err1
    End If
    RunAndWait = False
    End Function

    ....

    If RunAndWait("calc.exe", "c:\windows") Then
    Msgbox "Run OK!"
    End If
     
  4. Sandr

    Sandr Гость

    Чет не понял.. а Вы откуда его запускали?
     
  5. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Запускал я его из агента, я просто поставил в коде многоточие, думал это не очень важно.

    Код (Text):
    Sub Initialize 
    Dim CountError As Integer
    CountError = 0
    If RunAndWait("calc.exe", "c:\windows") Then
    Msgbox "Run OK!"
    End If
    end sub
     
  6. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: PavelT100
    в процесах калькулятор появился?
     
  7. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    нет, делаю CTRL-ALT-DEL, смотрю вкладку Processes - там нет calc.exe.
     
  8. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Вот нашёл на мелкософте, пробуйте
     
  9. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    А фактически у меня тот же самый код, есть нюансы по инициализации si, но практически они ни на что не повлияли. Ничего не изменилось. Что характерно - этот код на VBA например в Excel у меня работает, а в Lotus нет.
     
  10. root

    root Гость

    Для: PavelT100
    дождаться ее завершения и только после этого продолжать
    Код (Text):
        Set WShell = CreateObject("WScript.Shell")
    ReturnCode = WShell.Run("%windir%\notepad.exe", 1, True)
    Msgbox "123"
     
  11. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: root
    +1
    Так просто, что даже не интересно :)
     
  12. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Ура, спасибо за решение, задача решена, все работает. Но неудовлетворенность от процесса программирования под Lotus накапливается:
    1. почему не удается нормально работать с CreateProcess ?
    2. http://codeby.net/forum/threads/19277s0.html?gopid=88234& - тоже в результате всех мучений решение найдено обходное(это мягко говоря).
     
  13. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    1. У Вас тот же код в VB отрабатывался?
     
  14. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: PavelT100
    <!--QuoteBegin-PavelT100+4:12:2007, 12:05 -->
    <span class="vbquote">(PavelT100 @ 4:12:2007, 12:05 )</span><!--QuoteEBegin-->Ура, спасибо за решение, задача решена, все работает. Но неудовлетворенность от процесса программирования под Lotus накапливается:
    [snapback]88236" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Видимо, не те задачи решаешь. :ph34r:
     
  15. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Да, на VBA в книге Excel CreateProcess работал как родной и WaitForSingleObject тоже.
     
  16. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Ну, так он и есть родной - для Виндовз!

    А как быть в пингвине, маке и пр.?
     
  17. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Constantin A Chervonenko
    дык то что запускаеться на винде , н будет запускаться на других осях, в любом случае переделывать приёдеться
     
  18. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Разговор не об этом. У меня Lotus работает под Windows.

    Код (Text):
    Declare Function GetTempDir Lib "kernel32" Alias "GetTempPathA" (Byval n As Integer, Byval s As String) As Integer
    Функция GetTempPathA - прекрасно вызывается и работает, функция CreateProcess из той же библиотеки нет.
     
  19. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: PavelT100
    имхо неправильные входящие параметры, может чтото не так с классами
     
  20. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Я вот и стал искать помощи на форуме из-за того что не могу понять где я ошибаюсь, с параметрами ли, с классами ли. Код я привел. Но вообщем я доволен, спасибо за помощь root.
     
Загрузка...

Поделиться этой страницей