Я пытаюсь вызвать процедуру в DLL Delphi из C#. Процедура ожидает, что вызывающий абонент будет предварительно распределять и вводить array of array of TSomeRecord
, из которых он затем будет манипулировать элементами TSomeRecord
в качестве средства для возврата результатов. Итак, мне нужно обработать динамические массивы Delphi массивов X.
Теперь I have found here что динамический array of X
состоит из указателя на первый элемент динамического массива и что этот первый элемент имеет счетчик ссылок и длину (количество элементов) массива предварённого (оба 32-битные целых числа), и что элементы хранятся инлайн и смежно, так что все это выглядит в памяти:Какова структура памяти динамического массива Delphi динамического массива X?
rrrrllll000...000111...12... ^
с рррром счетчика ссылок , llll - длина,- элементы и ^, на которые указывает указатель. Это подтверждает; Я тестировал его, и он работает.
Для многомерных динамических массивов я предположил, что можно заменить array of Y
для X
в array of X
, другими словами, что наружный размер просто динамический массив (указателей) динамические массивы, например так:
rrrrllll000011112222... ^
где элементы 0000, 1111 и т. д. теперь являются 32-битными указателями на независимо распределенные динамические массивы. Однако делать это таким образом, я получаю нарушение прав доступа к моим неприятностям. По-видимому, это не так, как Delphi ожидает от меня этого. Может ли кто-нибудь объяснить мне, как я должен утра?
Спасибо за ваш ответ. Я понимаю, что легче диагностировать код (пример), но у меня его нет; только подпись процедуры. DLL - это черный ящик сторонней стороны. –
Тогда единственный совет, который я могу вам дать, - придерживаться принципа, согласно которому тот, кто выделяет, также должен освободить или обернуть DLL в Delphi delphi.exe (comserver) или dll, который удаляет автоматические типы из интерфейса –