Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
Требуется определить из Access запущен ли Word в системе? Можно с использованием Win API. Хрестоматийный пример DetectExcel, переделанный под Word (замена XLMAIN на OpusApp и т.д.) просьба не предлагать- вызов API FindWindow("OpusApp", 0) запускает Word (даже если Word не был запущен)и поэтому не годится. Прошу показать альтернативную проверку запущен ли Word в системе, если кто знает или может. Спасибо Влад.
14 ноя 04, 19:32    [1104625]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Shuhard
Member

Откуда:
Сообщений: 4998
в лоб ежели XP - tasklist через shell + разбор полёта
14 ноя 04, 19:42    [1104632]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Лох Позорный
Member

Откуда:
Сообщений: 9898


Как определить - дома ли жена? Придти домой и попробовать её убить, если не получиться - значит жены дома нет.
14 ноя 04, 19:48    [1104633]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
Спасибо. Уточняю, требуется совместимость со всеми Win, видимо без API не обойтись. Какова альтернатива FindWindow (требуется алгоритм работы с Running Object Table (ROT))?
PS: Excel с Word видимо ничего общего не имеет, так как судя по XLMAIN и OpusApp а также некоторым другим взаимоисключающим стилям, эти приложения написаны различными группами. Таким образом, то что для Excel Ok, на Word не распространяется.
14 ноя 04, 20:10    [1104651]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Geo
Member

Откуда:
Сообщений: 6883
:)
help
Функция GetObject

Если pathname является пустой строкой (""), GetObject возвращает новый экземпляр объекта указанного типа. Если аргумент pathname опущен, GetObject возвращает текущий активный объект указанного типа. Если ни одного объекта указанного типа не существует, возникает ошибка.


т.е.

dim a
on error resume next
set a = getobject(,"word.application")
if err.number<>0 then
  msgbox "Word не запущен"
else
  msgbox "Word запущен"
endif
on error goto 0
14 ноя 04, 20:10    [1104652]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
GetObject не катит, ты ее сам попробуй и увидишь, что err.number всегда больше 0, так как GetObject запускает Word даже если тот не был запущен!
14 ноя 04, 20:14    [1104656]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
Прошу прощения, err.number = 0 всегда после вызова GetObject(,"Word.Application")
14 ноя 04, 20:18    [1104657]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Geo
Member

Откуда:
Сообщений: 6883
Попробовал - у меня не запускает.
14 ноя 04, 20:18    [1104658]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Geo
Member

Откуда:
Сообщений: 6883
Попробовал. У меня не всегда =0.
14 ноя 04, 20:19    [1104659]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
Господа, а у вас все MS OfficeЫ лицензионные? Поверьте, разница есть, и очень большая, особенно когда работаешь с OLE. По этой причине я имею Office2000Pro и Office2003Pro лицензионные. Есть ли идеи про API?
14 ноя 04, 20:22    [1104661]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
vladlent
Прошу прощения, err.number = 0 всегда после вызова GetObject(,"Word.Application")

А если проверить
if a is nothing
?
14 ноя 04, 20:26    [1104664]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Geo
Member

Откуда:
Сообщений: 6883
vladlent
Господа, а у вас все MS OfficeЫ лицензионные? Поверьте, разница есть, и очень большая, особенно когда работаешь с OLE. По этой причине я имею Office2000Pro и Office2003Pro лицензионные. Есть ли идеи про API?

А что, у вас хелп отличается от приведенной цитаты? Она же из 2000/2002/2003:
Help
If pathname is a zero-length string (""), GetObject returns a new object instance of the specified type. If the pathname argument is omitted, GetObject returns a currently active object of the specified type. If no object of the specified type exists, an error occurs.
14 ноя 04, 20:29    [1104666]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
It is always not Nothing because Word gets started every time you run GetObject(,"Word.Application") statement in your program. Any other ideas (please let me know the quickest way with Win API, if anybody has experience of course)?
14 ноя 04, 20:30    [1104667]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Geo
Member

Откуда:
Сообщений: 6883
Возможно, в процессе тестирования были созданы и болтаются в списке задач "недобитые" Word'ы. Поэтому ошибка и не возникает. 2003 у меня лицензионный. И работает.
ЗЫ. В правилах есть просьба об использовании русского языка.
ЗЗЫ. Если есть ограничение по winapi, имеет смысл перенести топик в visual basic.
14 ноя 04, 20:35    [1104668]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
Вообще, ситуация с Word очень странная, так как FindWindow и GetObject работают совсем не так как нужно. Но на двух различных машинах ведут себя одинаково (в смысле не так как написано в Help), отсюда и мое обращение за помощью в форум, хотя я думаю, что альтернативу и сам найду, просто хотел побыстрее.
14 ноя 04, 20:35    [1104669]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
vladlent
Member

Откуда:
Сообщений: 10
Процесс тестирования был ОЧЧЕНЬ!!! длинным (на мой взгляд для такого пустяка по сравнению со всем приложением) и все тонкости вроде Word instances в системе отсутствовали. Спасибо в любом случае за затраченное время на общение по этой теме, посмотрим что можно сделать, если будет время то напишу как вышел из ситуации. Удачи! Влад.
14 ноя 04, 20:39    [1104672]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
vladlent
It is always not Nothing because Word gets started every time you run GetObject(,"Word.Application") statement in your program. Any other ideas (please let me know the quickest way with Win API, if anybody has experience of course)?

סליחה. כנראה לא קראתי טוב את מה שכתבת קודם
14 ноя 04, 21:16    [1104695]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
Lenivec
Member

Откуда: Москва
Сообщений: 278
Function IsWordLoad() As Boolean
On Error Resume Next
Dim WordApp As Object

    Set WordApp = GetObject(, "Word.Application")
    If Err.Number <> 0 Then
        Err.Clear
        IsWordLoad = False
    Else
        IsWordLoad = True
        Set WordApp = Nothing
    End If

End Function
Работает в коммерческом приложении без проблем вот уже на протяжении лет 6, и ни на одной из машин ни у одного из клиентов проблем не возникало.
15 ноя 04, 12:43    [1105757]     Ответить | Цитировать Сообщить модератору
 Re: Требуется определить из Access запущен ли Word в системе  [new]
baike2000
Member

Откуда:
Сообщений: 177
Const TH32CS_SNAPHEAPLIST As Long = 1           ' включить список куч в снапшот
Const TH32CS_SNAPPROCESS As Long = 2            ' включить списко процессов
Const TH32CS_SNAPTHREAD  As Long = 4            ' включить список тредов
Const TH32CS_SNAPMODULE  As Long = 8            ' включить список модулей
Const TH32CS_SNAPALL  As Long = 1 Or 2 Or 4 Or 8 ' в снапшот будет включено все
Const TH32CS_INHERIT As Long = &H80000000       ' снапшот может наследоваться

Type PROCESSENTRY32
    size            As Long    ' размер структур - нужно установить до вызова
    usage           As Long    ' ссылок на процесс - живет, пока не равно нулю
    processid       As Long    ' PID
    defaultHeapID   As Long    ' ID кучи процесса по умолчанию
    moduleID        As Long    ' MID :))
    threads         As Long    ' количество запущенных процессом тредов
    parentProcessID As Long    ' PID процесса, создавшего наш процесс
    priClassBase    As Long    ' базовый приоритет тредов
    flags           As Long    ' зарезервировано
    exeFile         As String * 255 ' лучшее напоследок - полный путь к процессам!
End Type
  
Declare Function CreateToolhelp32Snapshot Lib "Kernel32.dll" (ByVal dwFlag As Long, ByVal processid As Long) As Long
Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Boolean
Declare Function Process32First Lib "Kernel32.dll" (ByVal hSnapShot As Long, ByRef Procentry32 As PROCESSENTRY32) As Boolean
Declare Function Process32Next Lib "Kernel32.dll" (ByVal hSnapShot As Long, ByRef Procentry32 As PROCESSENTRY32) As Boolean


Function FindProcess(strProcess As String) As Boolean
   
   Dim flag As Boolean, hSnap As Long
   Dim Procentry As PROCESSENTRY32
   
   hSnap = CreateToolhelp32Snapshot(2, 0)
   flag = False
   Procentry.size = 291
   
   If Process32First(hSnap, Procentry) Then
      If InStr(UCase(Procentry.exeFile), UCase(strProcess)) <> 0 Then flag = True
      While (Not flag) And (Process32Next(hSnap, Procentry))
        If InStr(UCase(Procentry.exeFile), UCase(strProcess)) <> 0 Then
            flag = True
        End If
      Wend
   End If
   CloseHandle hSnap
   FindProcess = flag
End Function

Private Sub IsProcess()
  If FindProcess("WINWORD.EXE") Then MsgBox "Найден" Else MsgBox "Не найден"
End Sub
15 ноя 04, 14:18    [1106167]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить