powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TWordApplication и новые функции
22 сообщений из 22, страница 1 из 1
TWordApplication и новые функции
    #40132593
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ли возможность как-то расширить интерфейс TWordApplication, а вернее, его _Document, от Офиса XP новыми функциями? Нужна одна, добавленная в Офисе 2007. Попробовал в лоб:

Код: pascal
1.
2.
3.
4.
5.
6.
type
  _Doc = interface(WordXP._Document)
    procedure foo(...); safecall;
  end;

_Doc(WordApplication1.ActiveDocument).foo(...)



- AV
Access violation at address 751902C2 in module 'RPCRT4.dll'. Write of address 0052A074.

Описание этой функции скопировал с заголовочника для Офиса 2010 из D10.3, то есть он правильный.
Гуглил, но ничего путного не нашлось. Может, есть какой-то трюк с получением интерфейса? В крайнем случае слямзю заголовочник для Офиса 2010 и буду таскать вместе с софтиной, но хотелось бы более нормального решения
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132664
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно попробовать
Код: pascal
1.
Variant(WordApplication1.ActiveDocument).foo()


А вообще вот, когда-то разбирался с Excel
Код: pascal
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.
procedure TForm1.Button4Click(Sender: TObject);
var
  LCID :integer;
  DispID1 : Integer;
  exInf :TExcepInfo;
  erPar :UINT;
  parArray :array of Variant;
  aDispId     :  TDispId;
  s :WideString;
  params :TDispParams;
  opResult: HResult;
  XlsIDispatch: IDispatch;
  WorkBooksIDispatch: IDispatch;
  VarRes: OleVariant;
begin
  XlsIDispatch := xls; {xls := CreateOleObject('Excel.Application');}
  LCID := GetUserDefaultLCID;

  s := 'Visible';
  opResult := XlsIDispatch.GetIDsOfNames(GUID_NULL, @s, 1, LCID, @DispID1);

  parArray := VarArrayCreate([0,0], varBoolean);
  parArray[0] := True;
  aDispId := DISPID_PROPERTYPUT;

  params.cArgs := length(parArray);
  params.rgvarg := @parArray[0];
  params.cNamedArgs := 1;
  params.rgdispidNamedArgs := @aDispId;

  opResult := XlsIDispatch.Invoke(DispID1, GUID_NULL, LCID, DISPATCH_PROPERTYPUT, params, @VarRes, @exInf, @erPar);


  s := 'WorkBooks';
  opResult := XlsIDispatch.GetIDsOfNames(GUID_NULL, @s, 1, LCID, @DispID1);
  params.cArgs := 0;
  params.rgvarg := nil;
  params.cNamedArgs := 0;
  params.rgdispidNamedArgs := nil;
  opResult := XlsIDispatch.Invoke(DispID1, GUID_NULL, LCID, DISPATCH_PROPERTYGET, params, @VarRes, @exInf, @erPar);

  WorkBooksIDispatch := VarRes;

  s := 'Add';
  opResult := WorkBooksIDispatch.GetIDsOfNames(GUID_NULL, @s, 1, LCID, @DispID1);
  opResult := WorkBooksIDispatch.Invoke(DispID1, GUID_NULL, LCID, DISPATCH_PROPERTYGET, params, @VarRes, @exInf, @erPar);
  VarRes := UnAssigned;

end;
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132665
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Может, есть какой-то трюк с получением интерфейса?
Перестать использовать интерфейсы и использовать OleVariant и позднее связывание
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132692
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal
Есть ли возможность как-то расширить интерфейс TWordApplication, а вернее, его _Document, от Офиса XP новыми функциями? Нужна одна, добавленная в Офисе 2007.

Тупо импортировать библиотеку типов - не помогает?
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132750
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_> Перестать использовать интерфейсы и
_Vasilisk_> использовать OleVariant и позднее связывание

+много
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132759
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
istrebitel, у тебя, как я понял, через черный ящик OleVariant-а. С ним как раз особо проблем нет, вызывай что хочешь, а сервер либо обработает, либо вывалит ошибку.
_Vasilisk_
Перестать использовать интерфейсы и использовать OleVariant и позднее связывание

Можно, конечно, но удобняшек в виде методов и параметров жалко. Хотя оставлю как запасной вариант, т.к. кода довольно мало.
ъъъъъ
Тупо импортировать библиотеку типов - не помогает?

Закинул заголовочник от ХЕ2 для офиса 2010, вроде проканало, но думал, вдруг есть более компактный вариант. Можно еще, конечно, в DocumentDisp добавить нужный метод, но это все равно будет модификация RTL, разве что надо будет таскать один модуль вместо трех.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132761
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-BrutalМожет, есть какой-то трюк с получением интерфейса?
Fr0sT-Brutal
ъъъъъ
Тупо импортировать библиотеку типов - не помогает?

Закинул заголовочник от ХЕ2 для офиса 2010, вроде проканало, но думал, вдруг есть более компактный вариант. Можно еще, конечно, в DocumentDisp добавить нужный метод, но это все равно будет модификация RTL, разве что надо будет таскать один модуль вместо трех.

Fr0sT-Brutal, может ты и сам знаешь, но на всякий случай, есть процедура в Delphi "Импортировать библиотеку типов". Нужно, чтобы на ПК с Delphi стоял нужный Офис. В Delphi меню Component - Import Component - Import Type Library. Next - выбираем в списке зареганных в системе библиотек типов нужную. Дальше я обычно не ставил галку "Generate components wrappers", дальше Create unit, всё.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132766
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62
Fr0sT-Brutal, может ты и сам знаешь, но на всякий случай, есть процедура в Delphi "Импортировать библиотеку типов". Нужно, чтобы на ПК с Delphi стоял нужный Офис. В Delphi меню Component - Import Component - Import Type Library. Next - выбираем в списке зареганных в системе библиотек типов нужную. Дальше я обычно не ставил галку "Generate components wrappers", дальше Create unit, всё.

Да, в теории знал, но сам не делал никогда. Тоже вариант, чтобы получить заголовочники от 2007, которого в средах не предоставляют. Спасибо!
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132794
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62
Fr0sT-BrutalМожет, есть какой-то трюк с получением интерфейса?

Fr0sT-Brutal
пропущено...

Закинул заголовочник от ХЕ2 для офиса 2010, вроде проканало, но думал, вдруг есть более компактный вариант. Можно еще, конечно, в DocumentDisp добавить нужный метод, но это все равно будет модификация RTL, разве что надо будет таскать один модуль вместо трех.

Fr0sT-Brutal, может ты и сам знаешь, но на всякий случай, есть процедура в Delphi "Импортировать библиотеку типов". Нужно, чтобы на ПК с Delphi стоял нужный Офис. В Delphi меню Component - Import Component - Import Type Library. Next - выбираем в списке зареганных в системе библиотек типов нужную. Дальше я обычно не ставил галку "Generate components wrappers", дальше Create unit, всё.
В старых дельфях не отображается список 64-разрядных COM - серверов, нужно отдельный инструмент из поставки Delphi использовать.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132802
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Можно, конечно, но удобняшек в виде методов и параметров жалко.
Microsoft забивает на совместимость интерфейсов.
Мы используем как COM-объект одну (нашу) .Net сборку. Так вот вызов модуля обламывался на каждой новой версии .Net. При том, что сама сборка не менялась.

Проблема оказалась в том, что в стандартные классы добавлялись новые методы и плыли все смещения. После перехода на позднее связывание все стало стабильно работать
Fr0sT-Brutal
Закинул заголовочник от ХЕ2 для офиса 2010, вроде проканало
Таким образом вы жестко привязались к 2010 офису. Со старыми и новые версиями у вас большие шансы получить несовместимость
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132807
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Таким образом вы жестко привязались к 2010 офису. Со старыми и новые версиями у вас большие шансы получить несовместимость
+500!
у нас в конторе и филиалах зоопарк МС-офисов.
только позднее связывание.
иначе никак.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132820
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Таким образом вы жестко привязались к 2010 офису. Со старыми и новые версиями у вас большие шансы получить несовместимость

Признаться, я не очень понимаю механизм работы вот этой обертки. Но у меня офис 2007, и обертка от 2010 сработала как надо. ГУИДы у интерфейсов от ХР и 2010 вроде совпадают. Где тогда разница, только параметры и новые методы? В плане офиса, как мне кажется, МС неплохо соблюдает совместимость и если что-то меняет - то либо новые методы, либо добавляет параметры в конец. Хотя, если в функции больше параметров, чем ожидает сервер, тут возможен косяк. Лучше все-таки брать версию интерфейса от минимально поддерживаемой. Но так и позднее связывание надо применять по версии АПИ от минимальной, разве что можно динамически варьировать варианты вызова.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132828
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
ГУИДы у интерфейсов от ХР и 2010 вроде совпадают.
Вот именно это и страшно
Fr0sT-Brutal
В плане офиса, как мне кажется, МС неплохо соблюдает совместимость
Вам кажется
Fr0sT-Brutal
совместимость и если что-то меняет - то либо новые методы, либо добавляет параметры в конец
Замечательная совместимость! Тут добавили методов (не факт, что в конец), тут добавили параметров и все это выдали под старым интерфейсом. И где этот конец окажется при вызове stdcall?
Fr0sT-Brutal
Хотя, если в функции больше параметров, чем ожидает сервер, тут возможен косяк
А если меньше, то будет лучше?
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132845
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
свежий пример того как "МС неплохо соблюдает совместимость".
в версиях до 2007 (включительно) для определения размера
использованного региона в листе Excell применяли:
Код: pascal
1.
2.
    aSheet.Activate;
    R := aSheet.UsedRange;


в новых версиях Activate вызывает отлуп.
ибо тефаль, всегда думает о нас! ©
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40132959
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

то есть, они с 90-х и по 2007-й сохраняли странное поведение, и только потом его отключили? В этом претензия к плохой совместимости? И в 2022-м это свежий пример? То есть в 2020-м ещё было не так?

Я бы ожидал, что UsedRange работает без всякого предварительного Activate. Надеюсь, стало именно так?
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133304
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, всем спасибо за ответы :)
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133494
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_

Замечательная совместимость! Тут добавили методов ( не факт, что в конец ), тут добавили параметров и все это выдали под старым интерфейсом. И где этот конец окажется при вызове stdcall ?

Как я понял, изучая *Disp и всякие dispid, методы определяются по номеру. Пофиг, куда в новых версиях добавляют, пока старые номера не едут.
Насчет параметров - а как через olevar это делается? Портянки вариантов для каждой версии, по типу "XP - 1 параметр и 10 EmptyParam, 2007 - - 1 параметр и 11 EmptyParam, 2010 - - 1 параметр и 15 EmptyParam"?
А если меньше, то будет лучше?
Почитал про safecall, там параметры освобождает вызываемый. Получается, любое несовпадение будет приводить к ошибке.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133510
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Насчет параметров - а как через olevar это делается? Портянки вариантов для каждой версии, по типу "XP - 1 параметр и 10 EmptyParam, 2007 - - 1 параметр и 11 EmptyParam, 2010 - - 1 параметр и 15 EmptyParam"?
Все просто:
Код: pascal
1.
activedocument.saveas2(FileName:=result, FileFormat:=Format,CompatibilityMode:=Comp);
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133525
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Как я понял, изучая *Disp и всякие dispid, методы определяются по номеру. Пофиг, куда в новых версиях добавляют, пока старые номера не едут.
Правильно. Но это только при позднем связывании (aka OleVariant), а при раннем связывании dispid игнорируется и учитывается только смещение метода
Fr0sT-Brutal
Почитал про safecall
safecall - это stdcall + сахар для обработки HRESULT
Fr0sT-Brutal
там параметры освобождает вызываемый
Это не так важно как то, что вызываемая функция не знает сколько ей передали параметров
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133583
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barmaley57
Все просто:
Код: pascal
1.
activedocument.saveas2(FileName:=result, FileFormat:=Format,CompatibilityMode:=Comp);


Прикольно! :) немного VBA в дельфях.

_Vasilisk_
Это не так важно как то, что вызываемая функция не знает сколько ей передали параметров

Это как раз важно, потому что именно для чистки стека ей нужно знать аргументы. Если б не надо было - обратная совместимость по кол-ву аргументов была бы соблюдена.
Всё, догнал. Это получается прямая совместимость была бы: старый сервер мог переваривать новые вызовы. А так все равно новый сервер ожидает аргумент, которого нет.
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133600
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
потому что именно для чистки стека ей нужно знать аргументы
Функция не знает какие аргументы можно использовать. А очистка стека - это уже вторично
...
Рейтинг: 0 / 0
TWordApplication и новые функции
    #40133623
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
А очистка стека - это уже вторично

Типа, одноразовая предсмертная функция?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TWordApplication и новые функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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