'Type is not automatable' — не баг ли?

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

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

Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев »

Нижеследующий код не компилируется. Строковый литерал почему-то не воспринимается как ansistring. Более того, ничего не дает и приведение «ansistring('dummy')», хотя переменная воспринимается нормально. Это я что не так делаю, или баг компилятора?

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

{$mode objfpc}

program VError;

var
   v : variant;
   s : ansistring;

begin
  v.lalala(11);       // compiled
  v.blabla(s);        // compiled
  v.ololo('dummy');   // verror.pp(12,17) Error: Type is not automatable: "WideString"
end.


Добавлено спустя 13 минут 9 секунд:
Компилятор 2.5.1 из SVN.
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

ЭЭЭ, значит 2.5.1 компилит строковые константы в WideString типе. Может быть есть какие-то директивы, чтобы поменять это. А Variant видимо не поддерживает widestring.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Все немного хуже. Он ее внутри воспринимает и не как ansistring и не как widestring (это я малость по исходникам компилятора полазил). Причем, widestring по идее должна автоматизироваться...

К тому же — не срабатывает прямое приведение.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

А у меня не получается воспроизвести баг - все компилируется. Компилятор собран из svn 9 дней назад.

Добавлено спустя 1 минуту 33 секунды:
p.s. платформа Win32
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Linux 64. Компилятор свежайший...

Добавлено спустя 2 минуты 47 секунд:
Sergei I. Gorelkin писал(а):Компилятор собран из svn 9 дней назад

А номер ревизии какой?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Какой номер ревизии - точно не знаю, но это одна из тех ревизий, которые были 1 ноября, а были 16283, 16287, 16288.

Я еще проверю отдельно под linux-x86_64...
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

На более ранней 16259 — абсолютно то же самое.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Ага, в linux воспроизводится, с компилятором от июня месяца. И я даже начинаю смутно догадываться о причине...

В линуксе тип WideString идентичен типу UnicodeString, который как раз не automatable ни разу. Оно и в винде ругается при попытке передать аргумент типа UnicodeString.

Т.е. в линуксе вообще непонятно что использовать в качестве строкового типа... как все запущено, однако.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Однако непонятно, с какой радости строковый литерал — это WideString. А уж тем более, чего вдруг стало WideString'ом выражение «ansistring('ololo')»...
Вообще, сам по себе WideString под Linux не особо актуален.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

А что вообще значит 'automation' под linux? Для общего развития...
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Что реализуем, то и значит. Можно реализовать IDispatch, или Custom Variant...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

При вызове методов у variant всё, что хотя бы отдаленно напоминает строки, приводится к widestring. А к widestring оно приводится потому, что для них винда предоставляет общий менеджер памяти, так что вызываемая сторона может правильно освободить занимаемую ими память. Вообще используются только такие типы, управление памятью которых "понятно" вызываемой стороне. AnsiString передать нельзя, потому что для ее освобождения нужно вызвать внутреннюю процедуру RTL, которая к тому же своя отдельная для каждого процесса.

То есть изначально язык (Delphi) был завязан на определенную технологию (OLE), потом FPC добросовестно скопировал фичи языка, а потом уходим от винды и получается упс... OLE-то и нету. Есть аналогичные по функциональности библиотеки, но у каждой из них свой собственный тип, аналогичный WideString.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Однако AnsiString передать можно.

Добавлено спустя 55 секунд:
В смысле, переменная типа AnsiString вполне себе передается.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Да, действительно. Блин. То есть, правильнее было бы сказать, что не возникает ошибки компиляции, а что там на самом деле передается - отдельный вопрос.

...возвращаясь к началу темы - понятно, что баг есть, но до сих пор ни одной идеи, как его правильно описать.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Попробую разобраться, что именно там передается. Если получится. А вообще, ограничение какое-то надуманное — ведь, вообще говоря, в Variant можно завернуть много чего, и никак принимающая сторона не узнает, как там у него память управляется. Возможно, корректный вариант — передавать в автоматизации исключительно как «const ref»... Ну, то есть, документировать так, а как уж принимающая сторона распорядится — ее проблемы :)

Добавлено спустя 5 минут 10 секунд:
Кстати, насчет «что передается»... А где искать структуру последнего параметра DispInvoke?
Ответить