В вашем вопросе вы столкнулись с проблемой при работе с PSafeArray в Delphi. Вы пытаетесь извлечь данные из массива, который был загружен из JSON через COM-объект, созданный в C#. Однако, несмотря на то, что вы правильно инициализировали COM, ваш код некорректно обрабатывает элементы массива.
Шаги по решению проблемы
Проверка инициализации COM
Убедитесь, что COM-структуры корректно инициализированы перед использованием. В вашем случае, вы уже сделали это, используя CoInitialize(nil) перед началом работы с COM-объектами.
Корректное использование SafeArrayGetElement
Функция SafeArrayGetElement принимает три параметра: указатель на PSafeArray, индекс элемента и указатель на буфер, куда будет записан элемент массива. У вас в коде ошибка в том, что вы не инициализируете второй элемент массива LData. Вам нужно использовать LData[1] для второго элемента массива, который вы пытаетесь прочитать из вашего JSON, а именно числа 1603924965 и 1603925021.
Очистка ресурсов
После использования PSafeArray, не забудьте освободить ресурс, вызвав SafeArrayDestroy. Это необходимо, даже если массив был создан в другом языке и его владельцем является код на C#.
Обработка данных
При работе с SafeArrayAccessData убедитесь, что вы корректно обрабатываете указатель на данные и размер данных соответствует ожидаемому формату (в вашем случае, массив целых чисел).
Пример исправленного кода
var
LData: array of Int64;
//ptr: Pointer;
begin
// ...
SetLength(LData, (Class2_UBound - Class2_LBound) + 1);
// ...
for Index := Class2_LBound to Class2_UBound do
begin
OleCheck(SafeArrayGetElement(Class2_SafeArray, Index, LData[Index]));
// Исправление: инициализация второго элемента массива
if Index = 0 then
LData[1] := 0; // Инициализация вторым нулем, если не уверены в значении
if Index = 1 then
LData[1 - Index] := Index = Index in [1603924965, 1603925021] to Int64; // Присваивание корректных значений
end;
// ...
for Index := Low(LData) to High(LData) do
begin
Writeln(IntToHex(LData[Index], 8));
end;
// ...
end;
Заключение
При работе с PSafeArray важно внимательно обращаться с указателями и буферами данных, а также корректно освобождать ресурсы после использования. Убедитесь, что вы правильно обрабатываете индексацию и типы данных, и что ваш код может корректно обрабатывать ошибки COM.
Описание контекста: Пользователь столкнулся с проблемой извлечения данных из `PSafeArray` в Delphi, загруженного через COM-объект из C#, и ищет решение для корректной обработки элементов массива.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.