Выбор и подключение обьекта COM MS Word

Раздел посвящен программированию с использованием Power Basic.
Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Выбор и подключение обьекта COM MS Word

Сообщение Kroos » 22.02.2012 (Ср) 7:38

На машине запущено несколько копий Word. Реально ли получить указатель на нужную копию, подключиться к ней чтобы юзать ту копию в которой открыт требуемый документ?
как пытался делать (были варианты с FindWindow(ex) не помню уже почему отказался):
1) шарим все окна в поисках ворда EnumWindows
...
search_for="Microsoft Word"
EnumWindows(CODEPTR(ChildCallback),VARPTR(search_for))
...
2)в ChildCallback:
...
GetClassName(hWnd, szClass, SIZEOF(szClass))
IF szClass = "OpusApp" THEN ' ага вот ворд
...
'шарим дочерние окна, в интернетах говорят что нужно подцепиться к окну с классом _WwG
EnumChildWindows(hWnd, CODEPTR(ChildWCallback), 0)
3)в ChildWCallback:
...
IID_IDispatch = GUID$("{00020400-0000-0000-C000-000000000046}")
DIM ppvObject AS VARIANT 'не уверен насчет типа этого параметра
GetClassName(hWnd, szClass, SIZEOF(szClass))
IF szClass = "_WwG" THEN
AccessibleObjectFromWindow(hWnd,%OBJID_NATIVEOM,IID_IDispatch,ppvObject)
?("found " & STR$(hwnd)) ' вот окно с документом
...
далее по идее получили в ppvObject указатель (или нет? что за тип в pb этот ppvObject?) на обьект, к которому пытаемся подключиться, но бестолку
в общем, наверняка я не знаю всех тонкостей процесса, но если все же попытаться реализовать эту схему, возможно тогда подключаться к требуемому обьекту Word с нужным доком, а не к первому попавшемуся в ROT. Помогите допилить, или подскажите куда копать?

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Re: Выбор и подключение обьекта COM MS Word

Сообщение Димитрий » 22.02.2012 (Ср) 9:41

Может быть как в примерах:
Код: Выделить всё
#COMPILER PBWIN 10
#COMPILE EXE
#DIM ALL
#INCLUDE ONCE "oWord.inc"

FUNCTION PBMAIN()
  LOCAL oWordApp      AS Word_Application ' Application Interface
  LOCAL oWordDoc      AS Word_Document    ' Document Interface
  LOCAL lDocCount     AS LONG
  LOCAL vText         AS VARIANT
  LOCAL i             AS LONG

  oWordApp = GETCOM $PROGID_Application

  IF ISFALSE ISOBJECT(oWordApp) THEN
    MSGBOX "MSWORD не найден."
    EXIT FUNCTION
  END IF

  OBJECT GET oWordApp.Documents.Count TO lDocCount
  MSGBOX "Найдено " & FORMAT$(lDocCount) & " открытых файлов."
  FOR i = 1 TO lDocCount
    OBJECT CALL oWordApp.Documents.Item(i) TO oWordDoc
    OBJECT GET oWordDoc.Name TO vText
    MSGBOX VARIANT$(vText)
  NEXT i

  oWordDoc  = NOTHING
  oWordApp  = NOTHING
END FUNCTION             

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: Выбор и подключение обьекта COM MS Word

Сообщение Kroos » 22.02.2012 (Ср) 9:52

примеры не помогут. Может я неправильно обрисовал суть проблемы?
oWordApp = GETCOM $PROGID_Application
здесь подключается уже имеющийся обьект. Если обьектов Word много запущено тогда что, какой из них подключится? А мне нужен вполне конкретный, с конкретным открытым документом.
Или ты хочешь намекнуть, что коллекции документов общие между всеми обьектами Word и получить доступ к доку можно подключившись к любому обьекту?

coderx
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 05.09.2005 (Пн) 10:44
Откуда: Узбекистан

Re: Выбор и подключение обьекта COM MS Word

Сообщение coderx » 22.02.2012 (Ср) 10:39

oWordApp = GETCOM $PROGID_Application
здесь подключается уже имеющийся обьект. Если обьектов Word много запущено тогда что, какой из них подключится? А мне нужен вполне конкретный, с конкретным открытым документом.
Или ты хочешь намекнуть, что коллекции документов общие между всеми обьектами Word и получить доступ к доку можно подключившись к любому обьекту?

Если все документы были открыты пользователями (не через программными способами как CreateObject), то все документы находится в одном экземпляре Word, a CreateObject создает новый экземпляр Word, и у него будет своя коллекция документов.

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: Выбор и подключение обьекта COM MS Word

Сообщение Kroos » 25.02.2012 (Сб) 8:24

эм... так может кто-нибудь посоветовать-то как подключить нужный обьект Word через AccessibleObjectFromWindow, и возможно ли это в принципе?
или хотя бы рабочий пример использования AccessibleObjectFromWindow в pb чтобы разобраться с типами переменных и подключением обьектов, а с вордом я уж сам тогда разберусь...

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Выбор и подключение обьекта COM MS Word

Сообщение DarkMachine » 26.02.2012 (Вс) 3:35

Я тут немного поиграл с Ворд-ом и Spy++ и вот что вышло.
При поиске Ворд-а необходимо задать такое условие:
Код: Выделить всё
IF INSTR(szClass, "OpusApp") THEN ' ага вот ворд

и таких экземпляров несколько, если открыто несолько документов. Формат этой строки такой:
тоже самое и для _WwG
Код: Выделить всё
"ИмяДокумента.doc - Microsoft Word" OpusApp

Исходник, где весь процесс описывается нашел тут
http://www.northatlantawebdesign.com/in ... word-2007/
Скорее всего надо будет проинициализировать ppvObject.

плюс вот этот кусок из файла WinUser.inc ...
For all events, if you want detailed accessibility information, callers
' should
' ' Call AccessibleObjectFromWindow() with the hwnd, idObject parameters
' of the event, and IID_IAccessible as the REFIID, to get back an
' IAccessible* to talk to
' ' Initialize and fill in a VARIANT as VT_I4 with lVal the idChild
' parameter of the event.
' ' If idChild isn't zero, call get_accChild() in the container to see
' if the child is an object in its own right. If so, you will get
' back an IDispatch* object for the child. You should release the
' parent, and call QueryInterface() on the child object to get its
' IAccessible*. Then you talk directly to the child. Otherwise,
' if get_accChild() returns you nothing, you should continue to
' use the child VARIANT. You will ask the container for the properties
' of the child identified by the VARIANT. In other words, the
' child in this case is accessible but not a full-blown object.
' Like a button on a titlebar which is 'small' and has no children.

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: Выбор и подключение обьекта COM MS Word

Сообщение Kroos » 26.02.2012 (Вс) 7:12

я и работал по этому исходнику, нагибал его так и эдак... в результате в ppvobject получается какой-то идентификатор или указатель. Но проинициализировать обьект по этому указателю не получается. Я даже точно не знаю что именно получается в ppvobject, соотв-но как с ним работать...
In other words, the
' child in this case is accessible but not a full-blown object.

т.е. что, нельзя инициализировать обьект чтоли... (((

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Выбор и подключение обьекта COM MS Word

Сообщение DarkMachine » 26.02.2012 (Вс) 10:54

Запости исходник или в ПМ - посмотрю

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: Выбор и подключение обьекта COM MS Word

Сообщение Kroos » 26.02.2012 (Вс) 12:21

см. ЛС, компилировал в 9 версии (в 10 версии он конфликтует с win32api.inc, надо править). инклуд ворда в папке с примерами лежит.

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Выбор и подключение обьекта COM MS Word

Сообщение DarkMachine » 27.02.2012 (Пн) 15:10

Вообщем, нашел решение.
Коменты не поставил, думаю все ясно из кода. :)

Word у меня 2010-й, так что первый инклуд к нему с другим именем - впрочем неимеет значения.
Второй инклуд от WinApi враппера Jose Roca

Важно: коменты от СОМ генератора для первого инклуда (Word)
Код: Выделить всё
' Generated by: PowerBASIC COM Browser v.2.00.0087
' Date & Time : 26.02.2012 at 16:32
' Options:
' Always use an Interface Prefix : Off
' Interface Prefix               : Word
' Prefix ProgIDs, ClassIDs...    : Off
' Use ANSI Strings               : Off
' Use Singular Enumerations      : Off
' Generate Dispatch Interfaces   : On
' Include Parameter Names        : On
' Use Property Get/Set statements: On
' ------------------------------------------------
' Library Name: Word
' Library File: C:\Program Files (x86)\Microsoft Office\Office14\MSWORD.OLB
' Description : Microsoft Word 14.0 Object Library
' Help File : C:\Program Files (x86)\Microsoft Office\Office14\VBAWD10.CHM
' Help Context : 0
' GUID : {00020905-0000-0000-C000-000000000046}
' LCID : 0
' Version : 8.5


только кусок кода, где перечисляются дочернии окна.

Код: Выделить всё
..
..
#INCLUDE "oWord14.inc"
#INCLUDE "oleacc.inc"

FUNCTION ChildWCallback (BYVAL hWnd AS LONG, BYVAL lparm AS LONG) AS LONG
  LOCAL szClass        AS ASCIIZ * 255
  LOCAL wParent, wAppl AS IDISPATCH
  LOCAL IID_IDispatch  AS GUID
  LOCAL rt AS LONG
  IID_IDispatch = GUID$("{00020400-0000-0000-C000-000000000046}")

  GetClassName(hWnd, szClass, SIZEOF(szClass))
  IF szClass = "_WwG" THEN
     rt = AccessibleObjectFromWindow(hWnd,%OBJID_NATIVEOM,IID_IDispatch,wParent)
     IF rt=%S_OK THEN
        LOCAL oWordDoc     AS Word_Document
        LOCAL oWordApp     AS Word_Application
        ' один из важных моментов
        OBJECT GET wParent.Application TO wAppl
        LET oWordApp = wAppl

        DIM inf(0 TO 5) AS WSTRING
        OBJECT GET oWordApp.Version TO inf(0)
        OBJECT GET oWordApp.Caption TO inf(1)
        OBJECT GET oWordApp.Path TO inf(2)
        ?"Found Word with following details:" & $CR & _
            "Hwnd: " & HEX$(hwnd) & $CR & _
            "Version : " & inf(0) & $CR & _
            "Caption : " & inf(1) & $CR & _
            "FilePath: " & inf(2)
     ELSE
        FUNCTION = rt
     END IF
  ELSE
     FUNCTION = %FALSE
  END IF
  FUNCTION = %TRUE
END FUNCTION

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: Выбор и подключение обьекта COM MS Word

Сообщение Kroos » 27.02.2012 (Пн) 16:39

OBJECT GET wParent.Application TO wAppl

ага вон оно че )
ну красавчик, щас буду ковыряться спасибо )


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

    TopList