2016-02-16 2 views
2

Я хочу использовать функцию, объявленную в DLL, которая принимает указатели как параметры ввода/вывода, чтобы заполнить запись параметрами не указателя.Указатели, переданные по ссылке в Delphi (функции импорта из DLL)

Функция из DLL:

function WFS_GetMlaData( handle: WFS_HDL; 
          mla_idx: Integer; 
          mla_name: TCharWFSBufferArray; 
         var cam_pitch_um: PDouble; 
         var lenslet_pitch_um: PDouble; 
         var center_spot_offset_x: PDouble; 
         var center_spot_offset_y: PDouble; 
         var lenslet_f_um: PDouble; 
         var grd_corr_0: PDouble; 
         var grd_corr_45: PDouble): Integer stdcall; 

Запись:

MlaInfo = record 
    i : Integer; 
    idx : Integer; 
    name : TCharWFSBufferArray; 
    camPitchUm : double; 
    lensletPitchUm : double; 
    spotOffsetx : double; 
    spotOffsety : double; 
    lensletFocalLengthUm : double; 
    grdCorr0 : double; 
    grdCorr45 : double; 
end; 

Вызов функции:

if err = WFS_GetMlaData(handle, 
         MlaList[i].idx, 
         MlaList[i].name, 
         PDouble(MlaList[i].camPitchUm), 
         PDouble(MlaList[i].lensletPitchUm), 
         PDouble(MlaList[i].spotOffsetx), 
         PDouble(MlaList[i].spotOffsety), 
         PDouble(MlaList[i].lensletFocalLengthUm), 
         PDouble(MlaList[i].grdCorr0), 
         PDouble(MlaList[i].grdCorr45)) then MyWFS_HandleErrors(handle, err); 

С аналогичной функцией, которая проходит указатели на целое он работает, в вышеприведенном случае У меня есть Недопустимый Typecast Ошибка.

+0

Добро пожаловать в переполнение стека. Вы отметили этот C++, но здесь нет ничего о C++. Возможно, вы хотели включить объявление C++ (возможно, действительно C) этой DLL-функции. Пожалуйста, отредактируйте свой вопрос, чтобы включить это. –

+0

Почему вы изменили ответ, который вы приняли?Ваш текущий выбор предлагает решение, которое вы не можете реализовать (потому что вам не разрешено изменять функцию DLL), а затем предлагает сомнительный тип-бросок, который, вероятно, компилируется только при отключенной опции «typed @ operator» (который плохая идея). Ваш предыдущий выбранный предложил два изменения, которые вы могли бы сделать, и это даст вам более чистый код. –

ответ

2

Ответ в документации Parameters (Delphi) - Value and Variable Parameters. Мой полужирный подчеркивает это:

Если декларация рутины в определяет параметр Var, вы должны передать назначаемое выражение - то есть переменный, набранным постоянной (в {$ J +} состояние), разыменованного указателя, поле или проиндексированную переменную в процедуру, когда вы ее вызываете.


Что касается вашего случая, мой совет должен объявить новый тип:

PMlaInfo = ^TMlaInfo; 

И изменить сигнатуру функции:

function WFS_GetMlaData(AHandle: WFS_HDL; const AMlaInfo: PMlaInfo): Integer stdcall; 

Но есть своего рода "взлом" (dereferenc ed pointer):

PDouble((@MlaList[i].camPitchUm)^) 
+0

'PDouble ((@ MlaList [i] .camPitchUm) ^)' работает, это лучше для меня, потому что я не могу изменить подпись функции. – meller92

+1

Да, также объявление всех этих переменных будет скучным: - \ – fantaghirocco

4

Ваша функция DLL объявлена ​​неверно. Исходный код C имеет все эти параметры в качестве указателей для двойного - double*. Решение «верный огонь» не может пойти не так, как вы можете изменить объявление функции в соответствии с кодом C. Удалите модификаторы var из всех параметров функции.

Альтернативное решение снова для вас, чтобы изменить объявление функции, но на этот раз, чтобы сделать его немного более похожим на идиоматический Delphi. Сохраните модификаторы var, но измените тип параметров на Double вместо PDouble.

Если вы сделаете первое изменение, вы можете вызвать функцию, указав указатели на записи: @MlaList[i].camPitchUm без литья типа. Если вместо этого вы сделаете второе изменение, вы можете вызвать функцию, передав элементы записи напрямую, опять же без литья типов: MlaList[i].camPitchUm.

+0

Исправить меня Если я ошибаюсь, использование 'var' и pointer дает мне указатель на указатель? – meller92

+0

Это вообще правильно, Меллер. –

Смежные вопросы