c - Delphi 中通过引用传递的指针(从 DLL 导入函数)

标签 c delphi pointers dll delphi-xe7

我想使用在 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 的指针 — double*。可靠、不会出错的解决方案是更改函数声明以匹配 C 代码。从所有函数参数中删除 var 修饰符。

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

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

关于c - Delphi 中通过引用传递的指针(从 DLL 导入函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430790/

相关文章:

c - 多线程的段错误(核心转储)

C 井字棋初学者

delphi - Firemonkey中的自定义网格

delphi - 如何在Delphi 2009中使用反向字符串功能?

c++ - 取消引用指针会复制它吗?

c - 是我的代码错误还是我的电脑速度慢?

c - 即使使用 fflush 也会跳过 scanf

android - Delphi Android - 检测设备方向变化

c++ - 更新对象的属性时遇到问题?

c - 在没有 stdarg 的情况下访问可变参数函数参数