Передача массива по ссылке из Delphi 7 в C ++ Dll

Вот функция C ++, предоставляемая через DLL:

double my_exposed_cpp_function(int* my_array){
int i = my_array[2]; /* i should be 3 */
my_array[2]++;
return 0;
}

Вот объявление моей функции Delphi

function dll_function(var my_array: array of integer): Real; stdcall; external myDLL name 'my_exposed_cpp_function';

Вот что я хотел бы сделать в функции Delphi

procedure talk_to_dll();
var
return_value: Real;
my_array: array[0..2] of integer;
final_value: integer;
begin
my_array[0] = 1;
my_array[1] = 2;
my_array[2] = 3;
return_value := dll_function(my_array);
final_value = my_array[2]; /* my_array[2] should now be 4 */
end;

Надеюсь, этот пример прояснит мои намерения. Я могу использовать эту настройку для работы с более простыми типами данных, поэтому я знаю, что связь между Delphi и dll нормальная. Что мне нужно изменить, чтобы это работало?

2

Решение

Открытый массив Delphi фактически передается с использованием двух параметров: адреса первого элемента и количества элементов минус один.

Для вызова вашей функции C ++ вы не можете использовать открытый массив. Просто объявите функцию как получающую указатель на первый элемент:

function dll_function(my_array: PInteger): Real; stdcall;
external myDLL name 'my_exposed_cpp_function';

Назовите это так:

return_value := dll_function(@my_array[0]);

В какой-то момент вы можете позволить динамически изменять длину массива. В существующем коде предполагается, что массив состоит из трех элементов. Для большей универсальности вы должны передать дополнительный параметр, указывающий длину массива.

Я предполагаю, что функция C ++ действительно является stdcall, хотя ничто в этом вопросе не делает это явным.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector