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

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

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

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

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

Сообщение yus »

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

Операционка: 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]

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

Спасибо.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Плюньте и не используйте. :-)
Это баг. Я полагаю, что там объявлен излишне большой массив. Попробуйте эту штуку откомпилировать в 64-ех разрядном FPC и скажите, что будет, а то у меня сейчас только 32-ух разрядный, проверить не могу.
yus
новенький
Сообщения: 27
Зарегистрирован: 29.03.2015 13:29:29
Откуда: Москва

Сообщение yus »

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

Спасибо большое.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

Конечно имеет. :-)
Однако, чтобы Вам не ждать, пока разработчики с этим делом разберуться (не исключено, что это никому не нужно, поэтому руки не доходят) просто сами у себя переопределите тип TOleStrList. В оригинале это выглядит так:

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

TOleStrList = array[0..high(integer) div sizeof(POleStr))-1] of POleStr;

Вам нужно уменьшить размер массива, тогда он будет создаваться при компиляции без проблем. Эксперимент показал, что против 2..2,5 миллионов ячеек компилятор нисколько не возражает. ;-)

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

TOleStrList = array[0..2000000] of POleStr;

Естественно, если эти 2 миллиона ячеек Вам ни к чему, то попытайтесь рассчитать, сколько в реально работающей программе Вам их понадобится и подставьте это число.
yus
новенький
Сообщения: 27
Зарегистрирован: 29.03.2015 13:29:29
Откуда: Москва

Сообщение yus »

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

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

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

PS: Посмотрел в Delphi, там это выглядит так.

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

TOleStrList = array[0..65535] of POleStr;
Ответить