FPC 3.2.0 и передача параметров методу OLE-объекта по именам

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
tsknv
новенький
Сообщения: 14
Зарегистрирован: 25.09.2015 07:09:26

FPC 3.2.0 и передача параметров методу OLE-объекта по именам

Сообщение tsknv »

Здравствуйте.
Использую MS Office Word в качестве объекта автоматизации...

Код: Выделить всё

...
wdGoToLine=3;
...
wrd := CreateOleObject('Word.Application');
...
wrd.Selection.&GoTo(What:=wdGoToLine, Count:=1).Select;
...

код без ошибок работает под Lazarus 2.0.8 (FPC 3.0.4).
Пробую запускать под Lazarus 2.0.10 (FPC 3.2.0), компилируется, запускается,
но при попытке вызова wrd.Selection.&GoTo(What:=wdGoToLine, Count:=1).Select; получаю ошибку: Method 'Goto' is not supported by automation object
Вызов этого же метода с передачей параметров другим способом проходит нормально, т.е. конструкции wrd.Selection.&GoTo(wdGoToLine, 1, 1).Select; и wrd.Selection.&GoTo(wdGoToLine, , 1).Select; отрабатывают как положено.
Пробовал другие методы - так же, попытка передачи параметров по именам вызывает ошибку.

Метод GoTo описан в документации на Word как Selection.GoTo( _What_ , _Which_ , _Count_ , _Name_ ), все параметры не обязательные.

Передача параметров по именам(named parameters) больше не работает? или я что-то не так делаю?
tsknv
новенький
Сообщения: 14
Зарегистрирован: 25.09.2015 07:09:26

Сообщение tsknv »

Немного разобрался... видимо там все таки ошибка...
в модуле ComObj есть процедура SearchIDs у которой параметр Names это несколько строк разделенных символом #0.
Первая строка - имя процедуры(метода) OLE-сервера, следующие за ней имена параметров.
При компиляции в FPC 3.0.4 за первой строкой (в значении параметра Names) один символ #0, при компиляции в FPC 3.2.0 - два нулевых символа - это и вызывает некорректную обработку и ошибку при последующем вызове процедуры DispatchInterface.GetIDsOfNames.(параметр NamesArray неверный)

Пока решил правкой файла fpc\3.2.0\source\packages\winunits-base\src\ comobj.pp
строку 1430
inc(Names,NameLen+1);
заменить на
inc(Names,NameLen+1); if Names^=#0 then inc(Names);

эксперименты проводил в Lazarus 2.0.10 на консольной программке:
program onp_err;
{$MODE OBJFPC}
{$macro on}
uses SysUtils, ComObj;
var w:variant; err:string;
begin
writeln('FPC ver.: '+ IntToStr(FPC_FULLVERSION));
write('Press Enter to start IE...');
readln;
try
err := 'no error';
w := CreateOleObject('InternetExplorer.Application');
w.Visible := true;
w.Navigate(url:='https://ya.ru/');
w := UnAssigned;
except on E:Exception do
err := 'ERROR: ' + e.Message;
end;
writeln(err);
write('Press Enter to exit...');
readln;
end.

При просмотре стека вызовов вижу вот такую картиу:
#0 SEARCHIDS({<IUNKNOWN> = {}, }, 0x43e05c 'Visible', 1, 0x149f980) at C:\Lazarus2010\fpc\3.2.0\source\packages\winunits-base\src\comobj.pp:1430
#1 COMOBJDISPATCHINVOKE(0x0, ... at C:\Lazarus2010\fpc\3.2.0\source\packages\winunits-base\src\comobj.pp:1475
#2 VARIANTS$_$TDYNARRAYITER_$__$$_DONE at :0
#3 fpc_dispinvoke_variant at :0
#4 main at onp_err.pas:13

Не могу по стеку вызовов отследить откуда происходит вызов tdynarrayiter.done (#2 VARIANTS$_$TDYNARRAYITER_$__$$_DONE),
может быть кто нибудь сможет подсказать где находится fpc_dispinvoke_variant и как ее посмотреть в отладчике, что-то я в этом месте пока не понимаю, подскажите пожалуйста.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

fpc_dispinvoke_variant
содержится в:
\lazarus\fpc\3.2.0\source\rtl\inc\compproc.inc
\lazarus\fpc\3.2.0\source\rtl\inc\variant.inc
и, как я понимаю, является частью компилятора fpc
tsknv
новенький
Сообщения: 14
Зарегистрирован: 25.09.2015 07:09:26

Сообщение tsknv »

Да, но как в fpc_dispinvoke_variant поставить точку останова? не хочет отладчик там останавливаться, может чего не так делаю.
Хотя спрашиваю ради любопытства, думаю что править исходники компилятора особого смысла нет, надо ждать когда исправят.
Пока написал на https://bugs.freepascal.org/view.php?id=37355, может быть в следующей версии поправят.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

tsknv писал(а):Да, но как в fpc_dispinvoke_variant поставить точку останова?

Боюсь, что никак, если их присоединяет линковщик. Или разбираться в ассемблерном коде, я бы за это не взялся.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Да, но как в fpc_dispinvoke_variant поставить точку останова?
пересобрать fpc с отладочной информацией
tsknv
новенький
Сообщения: 14
Зарегистрирован: 25.09.2015 07:09:26

Сообщение tsknv »

Думаю что особого смысла лезть в исходники FPC нет, не делать же свою ветку FPC. :)
Скорее всего самое простое написать в баг трекер и, эта, как и другие ошибки, будет исправлена в следующих версиях.
Ответить