powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не работает COM-объект:разное объявление TSafeArray в модулях ActiveX разных версий Delphi
3 сообщений из 3, страница 1 из 1
Не работает COM-объект:разное объявление TSafeArray в модулях ActiveX разных версий Delphi
    #39851057
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Есть сторонняя COM-библиотека (на C#), в которой часть функций возвращает PSafeArray.

Когда я компилирую проект в Delphi 2007, из массива достаются правильные данные. Когда компилирую в Delphi XE8 - в момент выполнения происходит ошибка Integer overflow .

Пример кода считывания из PSafeArray
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
    confarray: PSafeArray;
    i: integer;
    idx: array[0..0] of integer;
    pi: PUnknown;
begin
    ...
    confarray := comp.GetConfigurations;
    for i := 0 to confarray.rgsabound[0].cElements - 1 do begin
      idx[0] := i;
      SafeArrayGetElement(confarray, idx, pi);
    ....




Integer overflow возникает на строчке
Код: pascal
1.
 for i := 0 to confarray.rgsabound[0].cElements - 1 do begin 

. Т.е. не получается считать cElements.

Пытаясь понять, в чем может быть дело, обнаружил, что TSafeArray имеет разное объявление в ActiveX.pas из Delphi 2007 и Winapi.ActiveX из Delphi XE8 (см. рисунок).

ActiveX.pas из Delphi 2007 и Winapi.ActiveX из Delphi XE8



Я добавил в XE-шный проект копию ActiveX.pas из Delphi 2007 и заменил Winapi.ActiveX в uses в модуле вызывающего кода и в _TLB.pas.
XE-шный проект заработал.

При нормальном выполнении в cElements значение меняется от 0 до, в моем случае, максимум 100. Изменение с unsigned-типа на signed-тип той же длины (4 байта) не должно ломать совместимость. Что ее ломает, я понять не могу.

P.S. Так же обратил внимание (просматривая изменения WinDiff'ом), что изменились структуры tagVARIANT, tagPROPVARIANT, tagSTATSTG, но они вроде не используются.
...
Рейтинг: 0 / 0
Не работает COM-объект:разное объявление TSafeArray в модулях ActiveX разных версий Delphi
    #39851158
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosInteger overflow возникает на строчке
Код: pascal
1.
 for i := 0 to confarray.rgsabound[0].cElements - 1 do begin 

Так и должно быть.

cElements = 0
Если cElements беззнаковое, то cElements - 1 = 4294967295. Это число не влазит в i: Integer

Варианты решения
1)
Код: pascal
1.
2.
3.
4.
5.
var
    i: integer;
begin
    ...
    for i := 0 to Integer(confarray.rgsabound[0].cElements) - 1 do begin


1)
Код: pascal
1.
2.
3.
4.
5.
6.
var
    i: Cardinal;
begin
    ...
    for i := 1 to confarray.rgsabound[0].cElements do begin
      idx[0] := i - 1;


А вообще нужно смотреть на ворнинги компилятора. Он предупреждаетCombining signed and unsigned types - widened both operands
...
Рейтинг: 0 / 0
Не работает COM-объект:разное объявление TSafeArray в модулях ActiveX разных версий Delphi
    #39851185
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Спасибо, помогло!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не работает COM-объект:разное объявление TSafeArray в модулях ActiveX разных версий Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]