Я использую Delphi для загрузки dll (которую я создал в Delphi XE-3) для взаимодействия с некоторым кодом C. Моя проблема заключается в том, чтобы выяснить, почему мои массивы не передаются функциям c - только они этого не делают. Файл delphi (упрощенный) выглядит так:
program CallcCode
uses
SysUtils, Windows,
DLLUnit in 'DLLUnit.pas'; // Header conversion
var
DLLHandle: cardinal;
n: Integer;
A: TArray<Integer>;
result1: Integer;
begin
// Initialize each Array
SetLength(A,n);
A[0] = ...;
// Load the DLL (and confirm its loaded)
DLLhandle := LoadLibrary('dllname.dll');
if DLLhandle <> 0 then
begin
result1 := dll_func1(n,A); // A and B are not passed correctly
end
FreeLibrary(DLLHandle);
end.
Я успешно «проследил» dll_func1 в первый раз, войдя в DLLUnit, который имеет:
const
nameofDLL = 'dllname';
function dll_func1(n: Integer; A: TArray<Integer>): Integer; cdecl; external nameofDLL;
Снова «трассируя в», я прихожу к файлу c, который по-прежнему имеет правильные значения n и DLLdefs, но A (под заголовком «Локальные переменные») стал:
[-] A :(Aplha-Numeric)
..[0] 0 (0x00000000)
Я знаю, что, по крайней мере, я обращаюсь к DLL (надеюсь) правильно, потому что другие вызовы функций работают должным образом, и я могу без проблем отследить файл dll_func1.c. Я попытался изменить функцию на
function dll_func1(n: Integer; A: PInteger): Integer; cdecl; external nameofDLL;
...
result1 := dll_func1(n,PInteger(A))
or
function dll_func1(n: Integer; A: PInteger): Integer; cdecl; external nameofDLL;
...
result1 := dll_func1(n,@A[0])
(используя как TArray, так и массив Integer или A), но изменений нет, что заставляет меня поверить, что это связано с проблемой, которую я не вижу. Все это компилируется и запускается, но результат1 неверен из-за сбоев TArray. Любые идеи о том, что происходит не так?
EDIT Функция в C как:
int dll_func1(int n, int A [])
PInteger
в вызовах функций (файл модуля), определил их какTArray<Integer>
в файле программы (где я их инициализировал) и использовалsolve(n, PInteger(Ap), PInteger(Ax))
; только массивы не передавались в функцию. Что вы подразумеваете под структурой, переданной неправильно? - person Kendra Lynne   schedule 21.06.2013TArray<T>
на границе интерфейса. Не могли бы вы сделать это для меня? Мы также подошли к этапу, когда, я думаю, вам нужно показать полный код. Сократите его до минимума и покажите оба кода. Делфи и С. - person David Heffernan   schedule 21.06.2013PInteger
и показать полный код для обеих сторон интерфейса (используя копирование и вставку, чтобы это был код, который вы фактически запускаете), это будет очень легко и просто исправить, Я совершенно уверен. - person David Heffernan   schedule 21.06.2013