C语言 在 Delphi 中通过引用传递的指针(从 DLL 导入函数)



我想使用在 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);

使用将指针传递给整数的类似函数,它可以工作,在上面的情况下,我有无效的类型转换错误。

DLL 函数声明不正确。原始 C 代码将所有这些参数作为指向双精度 — double* 的指针。肯定的、不会出错的解决方案是让您更改函数声明以匹配 C 代码。从所有函数参数中删除var修饰符。

替代解决方案再次是让您更改函数声明,但这次是让它看起来更像惯用的 Delphi。保留 var 修饰符,但将参数的类型更改为 Double 而不是 PDouble

如果进行第一次更改,则将通过将指针传递给记录成员来调用该函数:@MlaList[i].camPitchUm没有类型强制转换。如果改为进行第二次更改,则可以通过直接传递记录成员来调用该函数,同样没有类型转换:MlaList[i].camPitchUm

答案在参数(德尔福(-值和变量参数文档中。我的大胆强调:

如果例程

的声明指定了 var 参数,则必须在调用例程时将可赋值表达式(即变量、类型化常量(处于 {$J+} 状态(、取消引用的指针、字段或索引变量传递给该例程。


关于您的情况,我的建议是声明一个新类型:

PMlaInfo = ^TMlaInfo;

并更改函数的签名:

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

但是有一种">黑客"(取消引用的指针(:

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

最新更新