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

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

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

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

Сообщение tsknv » 14.07.2020 15:33:59

Здравствуйте.
Использую 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 08:09:26

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

Сообщение tsknv » 18.07.2020 08:43:36

Немного разобрался... видимо там все таки ошибка...
в модуле 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 и как ее посмотреть в отладчике, что-то я в этом месте пока не понимаю, подскажите пожалуйста.
tsknv
новенький
 
Сообщения: 14
Зарегистрирован: 25.09.2015 08:09:26

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

Сообщение Снег Север » 18.07.2020 09:20:07

fpc_dispinvoke_variant
содержится в:
\lazarus\fpc\3.2.0\source\rtl\inc\compproc.inc
\lazarus\fpc\3.2.0\source\rtl\inc\variant.inc
и, как я понимаю, является частью компилятора fpc
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2604
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение tsknv » 18.07.2020 10:18:04

Да, но как в fpc_dispinvoke_variant поставить точку останова? не хочет отладчик там останавливаться, может чего не так делаю.
Хотя спрашиваю ради любопытства, думаю что править исходники компилятора особого смысла нет, надо ждать когда исправят.
Пока написал на https://bugs.freepascal.org/view.php?id=37355, может быть в следующей версии поправят.
tsknv
новенький
 
Сообщения: 14
Зарегистрирован: 25.09.2015 08:09:26

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

Сообщение Снег Север » 18.07.2020 11:47:46

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

Боюсь, что никак, если их присоединяет линковщик. Или разбираться в ассемблерном коде, я бы за это не взялся.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2604
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение zub » 18.07.2020 14:06:55

>>Да, но как в fpc_dispinvoke_variant поставить точку останова?
пересобрать fpc с отладочной информацией
zub
долгожитель
 
Сообщения: 2579
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение tsknv » 18.07.2020 16:30:24

Думаю что особого смысла лезть в исходники FPC нет, не делать же свою ветку FPC. :)
Скорее всего самое простое написать в баг трекер и, эта, как и другие ошибки, будет исправлена в следующих версиях.
tsknv
новенький
 
Сообщения: 14
Зарегистрирован: 25.09.2015 08:09:26


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru