powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
31 сообщений из 31, показаны все 2 страниц
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32701652
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил автоматически рассылать факсы посредством программы VentaFax, которая дает возможность вызовом с помощью ключей вставлять нужный факс в свое расписание на отправку.
Средствами в Акссессе формирую табличку с требуемой инфой (факсовый номер, текст имени клиента, путь к файлу собственно факса), открываю форму и по кнопке запускаю рассылку.
Вот код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Private Sub sendFaxes_DblClick(Cancel As Integer)
Dim rst As DAO.Recordset, i As Integer
Dim fname As String  'Путь к файлу с текстом факса 
Dim VentaFax As String, FaxNumber As String, CommandString As String
Dim NickName As String
On Error GoTo err
VentaFax = "C:\Program Files\Venta\VentaFax & Voice 5\ventafax.exe"
If MsgBox("Отправляем факсы по списку внизу. Вы уверены?", vbOKCancel) = vbOK Then
Set rst = Me.VChild.Form.Recordset
rst.MoveFirst
    If rst.RecordCount >  0  Then
    Do Until rst.EOF
        If rst!Archive =  0  Then  'Посылаем только неархивную строчку 
FaxNumber = rst!FaxNumber
fname = rst!FilePath
NickName = rst!NickName
Debug.Print FaхNumber, NickName, fname
CommandString = "/t:" & FaxNumber & " /c:'" & NickName & "' /f:'" & fname & "' /s" & " /a2-"

i = ShellExecute(Application.hWndAccessApp, "open", VentaFax, CommandString,  0 , SW_HIDE)
 'MsgBox "Факс попал в расписание?", vbOKOnly 
        End If
mov:
    rst.MoveNext
    Loop
    End If
End If
ex:
Exit Sub
err:
If err.Number =  3000  Or err.Number =  3420  Then GoTo mov
MsgBox err.Number
GoTo ex
End Sub
Я вообще в вызовах через API не рублю, равно как и в идеологии управления окнами (штоб им пусто было).
Так вот, в работе этого кода возможны 2 исхода.
1. Если я код не торможу (на строчке 'MsgBox "Факс попал в расписание?", vbOKOnly стоит коммент), то он проходит рекордсет без своих ошибок, но, несмотря на правильные параметры в Debug.Print FaхNumber, NickName, fname (т.е. они все разные в соответствии с данными), в прогу VentaFax попадает только последняя строка, повторенная столько раз, сколько строк в рекордсете.
2. Если я код искусственно торможу вопросом, то он (после ответа на вопрос MsgBox "Факс попал в расписание?", vbOKOnly) вылетает с ошибкой 3420 - Object no Longer Set. При этом в форме вижу, что рекордсет действительно развалился, но не весь.

Как быть? Получается, что вполне успешно можно вставить во внешнюю прогу 1 (один) факс. Но нужно-то целый список скинуть? Насколько я понимаю, опять уперся в какую-то асинхронность, в этот раз уже при работе с внешним приложением. Может мой вызов ShellExecute в корне неверен? Или все же ShellExecute нужно притормозить, чтобы она успела все что надо в загруженную прогу скинуть (тогда - как)? Или все дело в проге VentaFax, т.е. она некорректно работает?
Заранее как всегда благодарен!
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703122
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, только таймер меня спасает. Дал заведомо достаточную задержку, чтобы прога отработала, никаких лишних вопросов, открытых рекордсетов и все такое. Передал в ShellExecute параметры запуска - и не дышать в течение полминуты. Во, блин автоматизация :(
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703124
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин... Где-то видел код, который запускает внешнее приложение и дожидается завершения его работы. Может поможет?
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703158
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю точно, что конкретно делает этот код Как дождаться завершения выполнения Shell?, но на уровне эмоций наверное - типа приложение запустилось, отработало, закрылось. Но в той штуке, которую запускаю я (VentaFax) задача "Расписание" является вроде бы даже самостоятельной аппликацией. VentaFax у меня типа открыто уже и воспринимает посылку из Shell только чтобы изъять оттудова ключи (факс, путь и пр.). Если вводить всю прогу в режим ОткройсяВся - прими посылку - Закройся, то по времени получится не полминуты, а больше. Так что хрен с ним. Нет нормального управления заданиями в виндах и нет. Обойдемся песочными часами подходящего размера
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703160
RVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТемныйМлин... Где-то видел код, который запускает внешнее приложение и дожидается завершения его работы. Может поможет?
Здесь, наверно... am.rusimport.ru/MSAccess/topic.aspx?ID=119 .
Лифчик, там, внизу почитай еще и обсуждение статьи
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703173
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, это щас попробую
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703174
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[VBScript]
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")

Set oExec = WshShell.Exec("calc")

Do While oExec.Status = 0
WScript.Sleep 100
Loop
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703178
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лифчик

о результатах обязательно в полном виде.!!!
аналогичная задача назревает и у меня, хочу встретить с честью (в твоем лице)!!!!!!
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703180
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha[VBScript]
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")

Set oExec = WshShell.Exec("calc")

Do While oExec.Status = 0
WScript.Sleep 100
LoopСтатус=0 это что, напомни плз
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703181
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя2Лифчик

о результатах обязательно в полном виде.!!!
аналогичная задача назревает и у меня, хочу встретить с честью (в твоем лице)!!!!!!Тоже с Вентой будешь работать?
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703185
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsh 5.6

PS
попробуй свой исходный код так,
ShellExecute(0, "open", VentaFax, CommandString, 0, SW_HIDE)
DoEvents
'MsgBox "Факс попал в расписание?", vbOKOnly



(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703186
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статус=0 - еще работает
статус=1 уже завершилось



(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703190
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛифчикЯ не знаю точно, что конкретно делает этот код Как дождаться завершения выполнения Shell?, но на уровне эмоций наверное - типа приложение запустилось, отработало, закрылось. Но в той штуке, которую запускаю я (VentaFax) задача "Расписание" является вроде бы даже самостоятельной аппликацией. VentaFax у меня типа открыто уже и воспринимает посылку из Shell только чтобы изъять оттудова ключи (факс, путь и пр.). Если вводить всю прогу в режим ОткройсяВся - прими посылку - Закройся, то по времени получится не полминуты, а больше. Так что хрен с ним. Нет нормального управления заданиями в виндах и нет. Обойдемся песочными часами подходящего размера

Ты именно так и пытаешься делать - откройся - закройся - откоройся заново.
Ищи способ обратиться к "расписанию" как com- объекту.
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703221
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victoshawsh 5.6

Нетути такой библы. Есть объект Wshell в WMI Scripting v.1.1. На мастая лезть?
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703224
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, завтра докуем. У проги ключи еще интересные обнаружились, запуск в минимизированном виде, завершить сеанс без выгрузки исполнит.модуля. Может и получится чего-нить.
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703332
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsh 5.6 - это версия Windows Scripting Host. 5.6 у тебя установлен, если работаешь на WinXP или установлен 6-й эксплорер. Можно поставить отдельно.
"Свою" загрузку ищи начиная отсюда
http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp

Свою версию (до загрузки) проверить можно так:
Нижеследующий текст сохрани в файле с расширением .vbs
и запусти его, (дважды ) жмакнув мышом на ём...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 Option Explicit

   dim WshShell      
   Set WshShell = Wscript.CreateObject("Wscript.Shell")
   Dim s
   s = ""  
   s = ScriptEngine & " Version "
   s = s & ScriptEngineMajorVersion & "."
   s = s & ScriptEngineMinorVersion & "."
   s = s & ScriptEngineBuildVersion
   
   WshShell.popup s, 0 



авторнету такой библы
в данном случае искать надо Microsoft Scripting Runtime.

На эту же dll смотрят
Microsoft VBScript Globals
и
Microsoft VBScript Regular Expression 5.5


PS
насчет "доделаем" -
я с Ventafax делов не имел...
Но, так себе представляю, что печатать на него нада...
доку что ли каку по нему выложи, - что-то я не нашел ничего, а програмь ради нея (доки) тянуть - страсть как не хочется...

ЗЫ2
попробуй все же в своем исходном коде -
1)ноль в качестве родительского окна
2)DoEvents после вызова ShelExecute (посмотри в мсдн для ShellExecute
коды возврата - если <32 то одна из описанных ошибок)


И еще -всё-таки не шибко это здорово - форму за рекордсет ворочать.
Хотя, похоже, в твоем случае проблема вокруг первого и двух последних параметров ShellExecute крутятся...






(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703390
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу попробовать...

мне надоело бумажные факсы отправлять.
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32703475
Фотография kedzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю победили или нет, я пользуюсь этим:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
Dim i As Long
Dim strCMD As String
    strCMD = "Полный путь к программе"
    i = ExecCmd(strCMD,  6 )    'В значке и без фокуса 
 'Анализ того как все прошло 
    If i <>  0  Then  ' 
        MsgBox "Произошла ошибка при выполнении команды:" & vbCrLf & _
        strCMD, vbCritical, "Внешнее приложение"
    End If

 
 '=============================================================== 
 'es 20.01.04 
 'Запуск процесса и ожидание его окончания  
 'API функции на тему ExecCmd с небольшой правкой взяты из  
 'MSDN ID:Q129796 
 '=============================================================== 
Private 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

Private Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessID As Long
   dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
   hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
   lpApplicationName As String, ByVal lpCommandLine As String, ByVal _
   lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
   ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
   ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _
   lpStartupInfo As STARTUPINFO, lpProcessInformation As _
   PROCESS_INFORMATION) As Long

Private Declare Function CloseHandle Lib "kernel32" _
   (ByVal hObject As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _
   (ByVal hProcess As Long, lpExitCode As Long) As Long

Private Const STARTF_USESHOWWINDOW& = &H1
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = - 1 &

 '===================================================================== 

Public Function ExecCmd(cmdline$, Optional WindowStyle& =  4 ) As Long
 'Опции по WindowStyle$: 
 '   0 - Window is hidden and focus is passed to the hidden window. 
 '   1 - Window has focus and is restored to its original size and position. 
 '   2 - Window is displayed as an icon with focus. 
 '   3 - Window is maximized with focus. 
 '   4* - Window is restored to its most recent size and position. The currently active window remains active. 
 '   6 - Window is displayed as an icon. The currently active window remains active. 
 '-------------------------------------------------------------------- 
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim ret As Long
 ' Initialize the STARTUPINFO structure: 
    With start
        .cb = Len(start)
        .dwFlags = STARTF_USESHOWWINDOW
        .wShowWindow = WindowStyle
    End With

 ' Start the shelled application: 
    ret = CreateProcessA(vbNullString, cmdline$,  0 &,  0 &,  1 &, _
    NORMAL_PRIORITY_CLASS,  0 &, vbNullString, start, proc)

 ' Wait for the shelled application to finish: 
    ret = WaitForSingleObject(proc.hProcess, INFINITE)
    Call GetExitCodeProcess(proc.hProcess, ret&)
    Call CloseHandle(proc.hThread)
    Call CloseHandle(proc.hProcess)
    ExecCmd = ret
End Function

 

...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32708666
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подход номер два. Вопрос к знатокам.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
Private Sub sendFaxes_DblClick(Cancel As Integer)
Dim fname As String  'Присоединяемый файл аттачмента 
Dim VentaFax As String, FaxNumber As String, CommandString As String
Dim NickName As String
Dim rst As DAO.Recordset, i As Integer
Dim WshShell, oExec
Dim locator As WbemScripting.SWbemLocator
Dim Service As WbemScripting.SWbemServices
Dim myob As WbemScripting.SWbemObjectSet
Dim myxz As WbemScripting.SWbemObject
Dim CtDist As Long
Dim PrStr As String
PrStr = "Venta*"

On Error GoTo err

VentaFax = "C:\Program Files\Venta\VentaFax & Voice 5\ventafax.exe"

If MsgBox("Отправляем факсы по списку внизу. Вы уверены?", vbOKCancel) = vbOK Then
Set rst = Me.VChild.Form.Recordset
    If rst.RecordCount >  0  Then
    rst.MoveFirst
        Do Until rst.EOF
        If rst!StatusID >  1  Then rst.MoveNext  'Посылаем только еще не посланную строчку 
FaxNumber = rst!FaxNumber
fname = rst!FilePath
NickName = rst!NickName
CommandString = "/t:" & FaxNumber & " /c:'" & NickName & "' /f:'" & fname & "' /s" & " /a2-"
rst.Edit
rst!TimeStamp = Now()
rst!StatusID =  2 
rst.Update

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(VentaFax & " " & CommandString)

Debug.Print oExec.Status
Do While oExec.Status =  0 
Sleep  100 
Debug.Print CommandString
Loop
Debug.Print oExec.Status

Set oExec = Nothing
Set WshShell = Nothing

que:     'ОПРОС ОЧЕРЕДИ НА ПРИНТЕР VentaFax 

Set locator = New WbemScripting.SWbemLocator
Set Service = locator.ConnectServer
Set myob = Service.ExecQuery("SELECT *   FROM Win32_PrintJob ")
CtDist =  0 
For Each myxz In myob
Debug.Print myxz.Name
 If myxz.Name Like PrStr Then    'PrStr = "Venta*" 
   CtDist =  1 
 End If
Next myxz
Debug.Print "----- число заданий на принтере VentaFax--->"; CtDist
Set myob = Nothing
Set Service = Nothing
Set locator = Nothing

If CtDist >  0  Then GoTo que  'Если в очереди на VentaFax есть задания, то опрашиваем снова 

rst.MoveNext
        Loop
    Else
    MsgBox "Все факсы отправлены"
    End If

End If
ex:
Exit Sub
err:
MsgBox err.Number
MsgBox err.Description
GoTo ex

End Sub
oExec.Status - отрабатывает, т.е. получаем 1 на выходе из WshShell. Однако Вента в это время запустила свой принтер "VentaFax" (стоит среди принтеров), и задание "Расписание", непосредственно к которому подключиться пока не понятно как. Интуитивно ясно, что больше времени жрет принтер, ибо он делает всякие преобразования форматов. Но: отловить его очередь так, как мне присоветовали знатоки про Acrobat Distiller я не могу. Хотя значок принтования ложится в трей, селект ("SELECT * FROM Win32_PrintJob ") - пустой. Может поменять чего нить в нем?
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32709335
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, проходит вариант Kedzo (Риспект!).
Причем - основной модуль Венты ДОЛЖЕН БЫТЬ ЗАГРУЖЕН!!! Иначе начинаются всякие висяки и побочные ветки (запускается менеджер сообщений и проч. непонятки)
Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
Private Sub sendFaxes_DblClick(Cancel As Integer)
Dim fname As String  'Присоединяемый файл аттачмента 
Dim VentaFax As String, FaxNumber As String, CommandString As String
Dim NickName As String, Path As String
Dim rst As DAO.Recordset, i As Integer
On Error GoTo err

VentaFax = "C:\Program Files\Venta\VentaFax & Voice 5\ventafax.exe"

If MsgBox("Отправляем факсы по списку внизу. Вы уверены?", vbOKCancel) = vbOK Then
Set rst = Me.VChild.Form.Recordset
    If rst.RecordCount >  0  Then
    rst.MoveFirst
        Do Until rst.EOF
        If rst!StatusID =  1  Then  'Посылаем только еще не посланную строчку 
FaxNumber = rst!FaxNumber
fname = rst!FilePath
NickName = rst!NickName
CommandString = "/t:" & FaxNumber & " /c:'" & NickName & "' /f:'" & fname & "' /s" & " /a2-"
rst.Edit
rst!TimeStamp = Now()
rst!StatusID =  2 
rst.Update

Path = VentaFax & " " & CommandString
    i = ExecCmd(Path,  4 )
 'Анализ того как все прошло 
    If i <>  0  Then  ' 
        MsgBox "Произошла ошибка при выполнении команды:" & vbCrLf & _
        Path, vbCritical, "Внешнее приложение"
    End If
        End If
rst.MoveNext
        Loop
    Else
    MsgBox "Все факсы отправлены"
    End If

End If
ex:
Exit Sub
err:
MsgBox err.Number
MsgBox err.Description
GoTo ex

End Sub
Может и WsShell прокатило бы, но с какой-то комбинацией параметров не получалось, а теперь я теперь боюсь на это дело дышать.

Уважаемые модераторы! Не соблаговолите за труд добавить в название топика строчки : Правильно ли я общаюсь с ShellExecute? (применительно к программе рассылки VentaFax).
PS Всем спасибо! Пивной животик вам, друзья, от меня гарантирован :)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32709433
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лифчик
Проздравляю достигнутым успехом.



(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32709436
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче - рано я радовался

Работал на С:. Потом переместился на сетевой диск и снова потянулись проблемы (кстати - у меня на сети и база не компактится-не сжимается - может от этого все траблы?)

Короче - однозначно пришлось добавить опрос очереди на принтер VentaFax (как имело место при манипуляциях с Acrobat-Distillerom).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
Private Sub sendFaxes_DblClick(Cancel As Integer)
Dim fname As String  'Присоединяемый файл аттачмента 
Dim VentaFax As String, FaxNumber As String, CommandString As String
Dim NickName As String, Path As String
Dim rst As DAO.Recordset, i As Integer, FirstStep As Integer
Dim locator As WbemScripting.SWbemLocator
Dim Service As WbemScripting.SWbemServices
Dim myob As WbemScripting.SWbemObjectSet
Dim myxz As WbemScripting.SWbemObject
Dim CtDist As Long
Dim PrStr As String
On Error GoTo err
PrStr = "Venta*"
FirstStep =  0 

VentaFax = "C:\Program Files\Venta\VentaFax & Voice 5\ventafax.exe"

If MsgBox("Отправляем факсы по списку внизу. Вы уверены?", vbOKCancel) = vbOK Then
Set rst = Me.VChild.Form.Recordset
    If rst.RecordCount >  0  Then
    rst.MoveFirst
        Do Until rst.EOF
        If rst!StatusID =  1  Then  'Посылаем только еще не посланную строчку 
FaxNumber = rst!FaxNumber
fname = rst!FilePath
NickName = rst!NickName
CommandString = "/t:" & FaxNumber & " /c:'" & NickName & "' /f:'" & fname & "' /s" & " /a2-"
rst.Edit
rst!TimeStamp = Now()
rst!StatusID =  2 
rst.Update

Path = VentaFax & " " & CommandString
    i = ExecCmd(Path,  4 )
 'Анализ того как все прошло 
    If i <>  0  Then  ' 
        MsgBox "Произошла ошибка при выполнении команды:" & vbCrLf & _
        Path, vbCritical, "Внешнее приложение"
    End If
If FirstStep =  0  Then Sleep  5000 
FirstStep =  1 
que:     'ОПРОС ОЧЕРЕДИ НА ПРИНТЕР VentaFax 

Set locator = New WbemScripting.SWbemLocator
Set Service = locator.ConnectServer
Set myob = Service.ExecQuery("SELECT *   FROM Win32_PrintJob ")
CtDist =  0 
For Each myxz In myob
Debug.Print myxz.Name
 If myxz.Name Like PrStr Then    'PrStr = "Venta*" 
   CtDist =  1 
 End If
Next myxz
Debug.Print "----- число заданий на принтере VentaFax--->"; CtDist
Set myob = Nothing
Set Service = Nothing
Set locator = Nothing

If CtDist >  0  Then GoTo que  'Если в очереди на VentaFax есть задания, то опрашиваем снова 
        End If
rst.MoveNext
        Loop
    Else
    MsgBox "Все факсы отправлены"
    End If

End If
ex:
Exit Sub
err:
MsgBox err.Number
MsgBox err.Description
GoTo ex
End Sub
Работает в таком режиме. Пройдет одну-две записи (чаще одну) и стопорит с кодом 3420 - Object no longer Set.
Я ему жму ОК, он выходит из п/п ДБЛ клик, а я сразу опять нажимаю и прога благополучно (ну в пределах моих небольших тестовых объемов - 10-15 штук) обрабатывает остальные строчки формы.
Ясно, что за первый проход запускается какая-то процедура, которая не успевает закрыться ко второму заходу, но как это отловить??? Причем задержка, которую я там поставил FirstStep - ни хрена не помогает. Прога должна обязательно вывалиться и снова запуститься.
Короче - открыт еще вопрос. Работать можно, но немного нервно.
Может у Вади лучше получится? :)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32709495
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для начала - пробуй не пользоваться рекордсетом формы -
открой свой "такой же" и посмотри - воспроизводится ли ошибка. или вали ПОЛНЫЙ код обеих (Всех) форм, задействованных в процессе.


(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32710304
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвязал рекордсет. Вылетания прекратились, но все вернулось к ситуации почти месячной давности, когда в расписание заносится первая строка, а затем многократно дублируется какая-то промежуточная (если номеров не много - то последняя. Вот код во всех двух формах + функция и описания Kedzo, которые есть выше.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
Private Sub sendFaxes_DblClick(Cancel As Integer)
Dim fname As String  'Присоединяемый файл аттачмента 
Dim VentaFax As String, FaxNumber As String, CommandString As String
Dim NickName As String, Path As String
Dim rst As DAO.Recordset, i As Integer, FirstStep As Integer
Dim locator As WbemScripting.SWbemLocator
Dim Service As WbemScripting.SWbemServices
Dim myob As WbemScripting.SWbemObjectSet
Dim myxz As WbemScripting.SWbemObject
Dim CtDist As Long
Dim PrStr As String, SQLString As String
On Error GoTo err
PrStr = "Venta*"
FirstStep =  0 
SQLString = "SELECT ID, McontentID, Archive, NickName, FaxNumber, " & _
"FilePath , Comment, StatusID, TimeStamp FROM Venta " & _
"WHERE ((Archive = 0) And (StatusID = 1)) ORDER BY NickName;"
 'Debug.Print SQLString 
VentaFax = "C:\Program Files\Venta\VentaFax & Voice 5\ventafax.exe"

If MsgBox("Отправляем факсы по списку внизу. Вы уверены?", vbOKCancel) = vbOK Then
 'Set rst = Me.VChild.Form.Recordset 

Set rst = CurrentDb.OpenRecordset(SQLString)
    If rst.RecordCount >  0  Then
    rst.MoveFirst
        Do Until rst.EOF
        If rst!StatusID =  1  Then  'Посылаем только еще не посланную строчку 
FaxNumber = rst!FaxNumber
fname = rst!FilePath
NickName = rst!NickName
CommandString = "/t:" & FaxNumber & " /c:'" & NickName & "' /f:'" & fname & "' /s" & " /a2-"
rst.Edit
rst!TimeStamp = Now()
rst!StatusID =  2 
rst.Update

Path = VentaFax & " " & CommandString
    i = ExecCmd(Path,  4 )
 'Анализ того как все прошло 
    If i <>  0  Then  ' 
        MsgBox "Произошла ошибка при выполнении команды:" & vbCrLf & _
        Path, vbCritical, "Внешнее приложение"
    End If
If FirstStep =  0  Then Sleep  5000 
FirstStep =  1 
que:     'ОПРОС ОЧЕРЕДИ НА ПРИНТЕР VentaFax 

Set locator = New WbemScripting.SWbemLocator
Set Service = locator.ConnectServer
Set myob = Service.ExecQuery("SELECT *   FROM Win32_PrintJob ")
CtDist =  0 
For Each myxz In myob
Debug.Print myxz.Name
 If myxz.Name Like PrStr Then    'PrStr = "Venta*" 
   CtDist =  1 
 End If
Next myxz
Debug.Print "----- число заданий на принтере VentaFax--->"; CtDist
Set myob = Nothing
Set Service = Nothing
Set locator = Nothing

If CtDist >  0  Then GoTo que  'Если в очереди на VentaFax есть задания, то опрашиваем снова 
        End If
rst.MoveNext
        Loop
    Else
    MsgBox "Все факсы отправлены"
    End If

End If
ex:
rst.Close
Set rst = Nothing
Exit Sub
err:
MsgBox err.Number
MsgBox err.Description
GoTo ex
End Sub
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Compare Database
Dim FirstClick As Integer

Private Sub Form_Click()
On Error GoTo err
If FirstClick =  1  And Me.ActiveControl.Name = "Archive" Then
Me.FilterOn = Not Me.FilterOn
End If
FirstClick =  1 
Exit Sub
err:
Me.FilterOn = Not Me.FilterOn
Exit Sub
End Sub

Private Sub Form_Open(Cancel As Integer)
Me.Filter = "((Archive=0))"
Me.FilterOn = True
FirstClick =  0 
End Sub
Вот что имеем до нажания кнопки
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32710309
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это получаем в расписании (щас Лох меня убьет)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32710346
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, вечером гляну
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32711384
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

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

при ближайшем рассмотрении - сказать по существу дела нечего.
Если завтре не скажу - тохды уже совсем не скажу.
Ставить мне эту венту сильно в лом, а по тексту явных мест для вмешательства (с учетом приведенных картинок и моего их понимания), приводящего к узбеху правильного формИрования факса - не нашел...
Лифчик, ты это - извиняй, если я тебя сильно обнадежил..
(жж

(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32711397
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что нашел - проверь - не твой ли случай
(новости от 25.10.2002. Версия 5.2 (build 12))
авторТеперь в параметрах командной строки при формировании задания в расписании в качестве имени файла можно указать не только файл в факсимильном формате, но и файл любого другого формата. Он предварительно будет сконвертирован в факсимильный формат и затем уже внесен в расписание. Командные файлы также могут содержать ссылки на файлы произвольных форматов. В связи с этим расширен синтаксис ключа /f:, задающего имя файла. Если после этого ключа имя файла не указано, то будет использоваться предыдущий файл. Таким образом, если в предыдущей строке командного файла был указан файл, требующий предварительной конвертации, а в текущей не указан, то будет использовано имя уже сконвертированного файла. Это сделает процесс создания больших расписаний максимально быстрым.

(с выражением лица)
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32711473
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктоша, ни в коем случае не ставь Венту, только если по работе понадобится факсы пачками отправлять :)
Ты и так на меня столько времени убил, что пиво в полной силе остается :)
А 100% работающий без ошибок вариант у меня есть. Он состоит в том, что я код из кнопки дблклика переношу в таймер формы и оставляю в рекордсете ОДНУ верхнюю неотправленную запись. После нажатия на кнопку отправки таймер включается и дает проход одной записи в 30 сек.(хватает с лихвой и для конвертации). И если форма работает без ошибок (а в таком варианте она не ошибается, ведь рекордсет открывается и тут же закрывается в таймере, все возможные транзакции аксеса, как я понимаю, в этом случае завершаются), то можно спокойно выйти на это время покурить или в другом окне заняться другой работой. Мне этого вполне достаточно!
Кстати, можно подумать и о предворительной конвертации текста в ТИФ-формат (он для венты графический), тогда можно и ускорить формирование расписания.

Но дело в том, что ускорять особо и не надо. Потому что надо соизмерять скорость работы отдельных частей своего софта. Все равно последующая отправка происходит в течение суток (если факсов под сотню) и здесь полчаса ничего не решают.

Так что я благодарствую всех участников за обсуждение и надеюсь, что оно пользу не только мне принесло (Вадя, ау!).

Единственный побочный вопрос, который хотелось бы для себя прояснить, поскольку уж залез в такие дебри, это - где бы чего почитать про процессы, подчиненные процессы, синхронность, асинхронность и проч.
Вот в частности, у меня догадка, что исполняющий модуль венты запускает какой-то подчиненный процесс, а сама выставляет флаг, что работу закончила. Как в таком случае следить за состоянием подчиненного процесса (в частности из моей аксессовской формы)? Может - это возможно, если знать имя подчиненного процесса? Ведь очереди на принтер научились отслеживать, неужели для произвольного процесса нельзя?
Вот такие пожелания накопились. Вроде все.
Удачных выходных!
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32711736
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лифчик
<>
Единственный побочный вопрос, который хотелось бы для себя прояснить, поскольку уж залез в такие дебри, это - где бы чего почитать про процессы, подчиненные процессы, синхронность, асинхронность и проч.

В этой части чтение может быть двух сортов - a)об устройстве Windows и программировании для него b) об администрировании с использованием WMI|ADSI и использовании скриптов вообще.
К первой категории, например, относится
http://www.rusedit.ru/view_book_sheet.asp?IDX=0&FIRST=1
или
http://books.dore.ru/bs/f1bid436.html
Углубляться сильно в книги такого сорта тебе, думаю, не стоит (пока) - но полистай при случае...

Полезнее гораздо и во всех отношениях сейчас буду книжки второй категории. В первую очередь советую -
Андрей Попов, Евгений шишкин Администрирование Windows с помощью WMI b WMIC. БХВ-Петербург 2004.
http://books.dore.ru/bs/f1bid2241.html
Прочитав эту книжку ты обязательно узнаешь, что
код (vbs) по получению списка процессов (написано для локального компьютера - для удаленного . заменить на имя компьютера) выглядит, например, так:

Dim objService
Dim colProcesses
Dim objP

Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
Set colProcesses =objService.ExecQuery("SELECT * FROM Win32_Process")

For Each objP in colProcesses
With objP
Debug.print .NAme, .Description, .Handle, .ParentProcessID, .CommandLine,
Debug.print .CreationDate, .ExecutablePath, .Priority,
Debug.print .MaximumWorkingSetSize, .MinimumWorkingSetSize
Debug.print .PageFileUsage, PeakVirtualSize,PeakWorkingSetSize
End with
Next

Найти таблицу Win32_Process в ОДБС, думаю, тоже не затруднит...

Кроме указанной книги (настоятельно) присоветую "предыдущую" книжку Попова -
Windows Script Host для Windows 2000/XP, БХВ-Петербург 2003
http://books.dore.ru/bs/f1bid337.html


По поводу венты присоветовать попробую вот что - проверить - как работает набор независивымых команд, поданных из одного или нескольких bat - файлов.
...
Рейтинг: 0 / 0
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
    #32711958
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто оно пользу не только мне принесло (Вадя, ау!).

изучаю внимательно. в избранное поставил сразу.
к внедрению (сначала код написать конечно) готов уже давно, нада начальство убедить, что через венту проще работать будет.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]