2013-07-15 7 views
1

Я ищу, чтобы получить собственный дескриптор окна окна PowerPoint с помощью Java/JACOB. MSDN documentation, кажется, предполагают, что это должно быть возможно только захватить собственность «HWND», так что я пытаюсь, что вот так:JACOB получить HWND окна

app = new ActiveXComponent("PowerPoint.Application"); 
Dispatch presentations = app.getProperty("Presentations").toDispatch(); 
presentation = Dispatch.call(presentations, "Open", fileLocation).toDispatch(); 
EnumVariant windows = new EnumVariant(Dispatch.get(presentation, "Windows").toDispatch()); 
Dispatch window = windows.nextElement().toDispatch(); 
Dispatch.get(window, "HWND"); //Exception here 

Однако, я, кажется, не быть в состоянии получить окно с этим справиться путь - я получаю следующее сообщение об ошибке:

Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered: 
At Invoke of: HWND 
Description: 80020003/Member not found. 

at com.jacob.com.Dispatch.invokev(Native Method) 
at com.jacob.com.Dispatch.invokev(Dispatch.java:625) 
at com.jacob.com.Dispatch.get(Dispatch.java:788) 
at tester.PowerpointSlideShowRunner.<init>(PowerpointSlideShowRunner.java:54) 
at tester.PowerpointSlideShowRunner.main(PowerpointSlideShowRunner.java:154) 

Является ли это ошибка в библиотеке, или я делаю что-то неправильно/недоразумение что-то здесь? Последнее вполне возможно, так как я совершенно не знаком с Джейкобом. В любом случае, как я должен захватить HWND окна Powerpoint с помощью JACOB?

+1

«Документация MSDN, похоже, предлагает ...»: какая документация MSDN? Не документация по объектной модели PowerPoint, насколько я могу видеть: http://msdn.microsoft.com/en-us/library/ff744694.aspx –

+0

@ChrisDickson Я действительно смотрел ссылку, которую я только что обновил. с, но я мог бы искать не в том месте, извините! Если да, то знаете ли вы, как лучше всего захватить HWND другим способом? – berry120

ответ

3

Документация по MSDN, которую вы связали, предназначена для сборки .NET Interop, которая обертывает объектную модель PowerPoint COM для использования управляемым кодом .NET, а не для самой объектной модели COM.

метаданных в сборке взаимодействия показывает, что есть на самом деле недокументированная HWND свойство присутствует в интерфейсе COM к DocumentWindow, но он несет атрибут специальной библиотеки типа FUNCFLAG_FRESTRICTED которая indicates that это

is intended for system-level functions or functions that type browsers should not display.

Я представляю себе это является причиной того, что ваша попытка вызвать это свойство по имени через интерфейс отправки не работает.

Однако метаданные сборки Interop также показывают, что DISPID (идентификатор отправки) для этого ограниченного свойства - это значение 0x7e4. Я не очень хорошо знаком с библиотекой JACOB, но я считаю, что это переопределение, которое позволяет получить значение свойства по DISPID, а не по имени:

Dispatch.get(window, 0x7e4); 

Я предлагаю вам дать этому попытку.

+0

Спасибо, этот DISPID действительно возвращает мне объект - но тот, который, к сожалению, не дает мне HWND int, кажется, содержит два DISPID - 0x1 и 0x4. 1 снова дает ссылку на окно презентации, а 4 дает мне int, но всегда кажется, что это 34, а не дескриптор окна. Есть идеи? – berry120

+0

«кажется, содержит два DISPIDs» ... Я не понимаю, что вы здесь говорите. Возвращаемый объект - это «Вариант»: каков его базовый тип ('getvt()')? –

+0

Извините, должно быть, было яснее. Основной тип - 'Dispatch' (' getvt() 'возвращает 9), поэтому я могу захватить объект Dispatch' getDispatch() '. Однако я не уверен в типе этой особой Диспетчеризации, и, перейдя через DISPID, кажется, производят только два, 0x1 и 0x4. Если я вызываю 0x1 (через 'Dispatch.get (hwnd, 0x1)', предполагая, что hwnd - это отправка, которую я получил от вызова 0x7e4 выше), тогда я получаю возвращенную отправку, которая равна объекту окна, если я вызываю 0x4, тогда я получаю целое число, которое всегда кажется 34 (что, насколько я могу судить, это не HWND). – berry120

Смежные вопросы