Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ? / 25 сообщений из 31, страница 1 из 2
20.09.2004, 10:30:30
    #32701652
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Решил автоматически рассылать факсы посредством программы 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
20.09.2004, 19:33:54
    #32703122
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Короче, только таймер меня спасает. Дал заведомо достаточную задержку, чтобы прога отработала, никаких лишних вопросов, открытых рекордсетов и все такое. Передал в ShellExecute параметры запуска - и не дышать в течение полминуты. Во, блин автоматизация :(
...
Рейтинг: 0 / 0
20.09.2004, 19:35:19
    #32703124
Темный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Млин... Где-то видел код, который запускает внешнее приложение и дожидается завершения его работы. Может поможет?
...
Рейтинг: 0 / 0
20.09.2004, 19:55:19
    #32703158
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Я не знаю точно, что конкретно делает этот код Как дождаться завершения выполнения Shell?, но на уровне эмоций наверное - типа приложение запустилось, отработало, закрылось. Но в той штуке, которую запускаю я (VentaFax) задача "Расписание" является вроде бы даже самостоятельной аппликацией. VentaFax у меня типа открыто уже и воспринимает посылку из Shell только чтобы изъять оттудова ключи (факс, путь и пр.). Если вводить всю прогу в режим ОткройсяВся - прими посылку - Закройся, то по времени получится не полминуты, а больше. Так что хрен с ним. Нет нормального управления заданиями в виндах и нет. Обойдемся песочными часами подходящего размера
...
Рейтинг: 0 / 0
20.09.2004, 19:58:06
    #32703160
RVI
RVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
ТемныйМлин... Где-то видел код, который запускает внешнее приложение и дожидается завершения его работы. Может поможет?
Здесь, наверно... am.rusimport.ru/MSAccess/topic.aspx?ID=119 .
Лифчик, там, внизу почитай еще и обсуждение статьи
...
Рейтинг: 0 / 0
20.09.2004, 20:07:16
    #32703173
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Спасибо, это щас попробую
...
Рейтинг: 0 / 0
20.09.2004, 20:07:59
    #32703174
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
[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
20.09.2004, 20:10:35
    #32703178
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
2Лифчик

о результатах обязательно в полном виде.!!!
аналогичная задача назревает и у меня, хочу встретить с честью (в твоем лице)!!!!!!
...
Рейтинг: 0 / 0
20.09.2004, 20:10:50
    #32703180
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
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
20.09.2004, 20:12:41
    #32703181
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
вадя2Лифчик

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

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



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



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

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

Нетути такой библы. Есть объект Wshell в WMI Scripting v.1.1. На мастая лезть?
...
Рейтинг: 0 / 0
20.09.2004, 20:53:32
    #32703224
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Ладно, завтра докуем. У проги ключи еще интересные обнаружились, запуск в минимизированном виде, завершить сеанс без выгрузки исполнит.модуля. Может и получится чего-нить.
...
Рейтинг: 0 / 0
21.09.2004, 02:31:54
    #32703332
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
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
21.09.2004, 07:35:55
    #32703390
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
хочу попробовать...

мне надоело бумажные факсы отправлять.
...
Рейтинг: 0 / 0
21.09.2004, 09:23:51
    #32703475
kedzo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки 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.
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
23.09.2004, 15:01:41
    #32708666
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки 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.
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
23.09.2004, 19:26:42
    #32709335
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Короче, проходит вариант 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
23.09.2004, 21:18:36
    #32709433
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
2 Лифчик
Проздравляю достигнутым успехом.



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

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

Короче - однозначно пришлось добавить опрос очереди на принтер 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
23.09.2004, 23:31:55
    #32709495
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
для начала - пробуй не пользоваться рекордсетом формы -
открой свой "такой же" и посмотри - воспроизводится ли ошибка. или вали ПОЛНЫЙ код обеих (Всех) форм, задействованных в процессе.


(с выражением лица)
...
Рейтинг: 0 / 0
24.09.2004, 13:20:57
    #32710304
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
Отвязал рекордсет. Вылетания прекратились, но все вернулось к ситуации почти месячной давности, когда в расписание заносится первая строка, а затем многократно дублируется какая-то промежуточная (если номеров не много - то последняя. Вот код во всех двух формах + функция и описания 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
24.09.2004, 13:22:17
    #32710309
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ?
А это получаем в расписании (щас Лох меня убьет)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильно ли я общаюсь с ShellExecute (применительно к программе рассылки VentaFax) ? / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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