Поведение при объявлении TOleStrList.

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

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

Поведение при объявлении TOleStrList.

Сообщение yus » 22.07.2015 15:49:02

Доброго здравия всем.

Операционка: Windows 7 x64
Среда разработки: Lazarus 1.4.0
FPC: 2.6.4

Возникла необходимость попользоваться TOleStrList.

Описываю проявление поведения.
Создаю новый проект, кидаю кнопку на форму и в коде пишу.

Код: Выделить всё
uses
  ..., ActiveX;


Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  str: string;
//  a: TOleStrList; // <--- uncomment this line
begin
  str := 'qwerty';
  ShowMessage(str);
end;           


Если раскомментировать строку в которой идет объявление TOleStrList, то собственно приложение перестает работать. При нажатии на кнопку вываливается сообщение.
[Window Title]
Error

[Content]
Project project1 raised exception class 'External: SIGSEGV'.

At address 4246D3

[OK]

Объяснение такому поведению не нахожу, если кто сталкивался просветите пожалуйста, как быть и что делать.

Спасибо.
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва

Re: Поведение при объявлении TOleStrList.

Сообщение Vadim » 22.07.2015 16:21:14

Плюньте и не используйте. :-)
Это баг. Я полагаю, что там объявлен излишне большой массив. Попробуйте эту штуку откомпилировать в 64-ех разрядном FPC и скажите, что будет, а то у меня сейчас только 32-ух разрядный, проверить не могу.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Поведение при объявлении TOleStrList.

Сообщение yus » 22.07.2015 17:17:36

При любой сборке (win32, x64) поведение одинаковое.
Жаль, что бага, пытаюсь использовать заголовочные файлы от Delphi, для одного COM сервера, а там результат возвращается в виде TOleStrList.
Имеет смысл оформлять как багу для разработчиков?

Спасибо большое.
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва

Re: Поведение при объявлении TOleStrList.

Сообщение Vadim » 22.07.2015 19:20:14

yus писал(а):Имеет смысл оформлять как багу для разработчиков?

Конечно имеет. :-)
Однако, чтобы Вам не ждать, пока разработчики с этим делом разберуться (не исключено, что это никому не нужно, поэтому руки не доходят) просто сами у себя переопределите тип TOleStrList. В оригинале это выглядит так:
Код: Выделить всё
TOleStrList = array[0..high(integer) div sizeof(POleStr))-1] of POleStr;

Вам нужно уменьшить размер массива, тогда он будет создаваться при компиляции без проблем. Эксперимент показал, что против 2..2,5 миллионов ячеек компилятор нисколько не возражает. ;-)
Код: Выделить всё
TOleStrList = array[0..2000000] of POleStr;

Естественно, если эти 2 миллиона ячеек Вам ни к чему, то попытайтесь рассчитать, сколько в реально работающей программе Вам их понадобится и подставьте это число.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Поведение при объявлении TOleStrList.

Сообщение yus » 22.07.2015 21:01:16

Мне достаточно 100000, количество элементов возвращаемое COM сервером не более 100000.

В эту сторону и склонялся. Попробую.

Багу оформлю, пусть болтается, может у кого нибудь, когда нибудь дойдут руки.
Большое спасибо.

PS: Посмотрел в Delphi, там это выглядит так.
Код: Выделить всё
TOleStrList = array[0..65535] of POleStr;
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва


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

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

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

Рейтинг@Mail.ru