将DLL调用函数从C转换为Delphi

时间:2015-05-16 02:24:51

标签: c delphi dll

所以,正如标题所说,我正在努力翻译一些函数来调用DLL,我在C中有文档,但我需要在Delphi中使用它。

经过几次初步尝试,在翻译后解决了一些编译错误后,在你们(topic here)的帮助下,其中一些仍然无效。主要是变量作为参数的问题......

首先是主题:我买了一台由一些捷克公司制造的USB逻辑分析仪和示波器,它配备了相当基础和有限的软件,但有一个DLL和(差)文档,介绍如何在我们自己的应用程序中实现它为了与分析仪进行通信。

现在,本文档(found here)有几个函数,用C编写(下面的代码段落1)。我已将它们全部翻译成Delphi(下面的代码段落2),但只有大约一半的人工作。

我需要一些帮助来确定问题所在:

  • 是我将函数翻译成Delphi,还是它 在其他地方?
  • 甚至可以通过Delphi完成吗?
  • 文档太差了,无法在Delphi中实现它, 还是够了?

注意:使用原始软件,所有功能和所有数据通信都能正常工作!因此,我认为可以安全地假设所有不工作的都是DLL或我的Delphi代码中的问题,而不是设备本身......

int SetAnalogChannels(int CH1Gain, int CH2Gain, bool CH1Couple, bool
CH2Couple, bool CH1Multiplier, bool CH2Multiplier)
  

CHXGain:可能的值为10,20,50,100,200,500 mV / div。仅发送整数以设置此值

在这里,我无法发送int CH1Gain和int CH2Gain。设备始终向函数返回0,这意味着增益参数无效。不知道为什么......

function SetAnalogChannels(CH1Gain, CH2Gain: integer; CH1Couple, CH2Couple,
                           CH1Multiplier, CH2Multiplier: boolean): integer;
                           stdcall; external 'E_l80.dll';

long RetrieveDSOData(unsigned char whatchannels, double *DSOCH1,
double *DSOCH2, unsigned short *LADATA, unsigned char Nth_Sample)
  

DSOCHX:指向来自DSO通道的电压点阵列的指针   LADATA:指向LA数据数组的指针。

在这里,我不知道那些类型应该是什么,如果它们确实是指向数组的指针(尽管没有[]标记。但是从设备的逻辑视图来看,它应该是一个数组。 32个值......)。
编辑:我只是想出了我的错误和浅薄的文档阅读。函数的return给出了数组的确切大小!

function RetrieveDSOData(whatchannels: uchar; var DSOCH1, DSOCH2: TLAArray;
                         var LADATA: array of ushort; Nth_Sample: uchar):
                         longint; stdcall; external 'E_l80.dll';

float SetUPPS1(float Voltage)

在这里,这很奇怪。看起来我设置正确,但函数返回始终为0,尽管它应该是其他值。我使用“扩展”作为浮点类型...我可以看到我正确设置它,因为另一个函数给我当前状态,它随着这个设置改变...

function SetUPPS1(Voltage: extended): extended; stdcall; external 'E_l80.dll';

long SetupAWG(double *AnalogVoltage, short *DigitalData, long
BufferSize, double DCOffsetVoltage, double SampleFrequency, long Use4xGain, double
OutputImpedance, long Repeat,long Triggered, long OverrideOtherClocks)
  

AnalogVoltage:指向电压阵列的指针;
  DigitalData:指向数字数据阵列的指针;

这里,与数组相同的问题。但是,基于用法,我相信这个数组是要发送的数组,而不是通过参数接收,因此这里的“var”可能是错误的?

function SetupAWG(var AnalogVoltage: double; var DigitalData: short; BufferSize: longint; 
                      DCOffsetVoltage, SampleFrequency: double; Use4xGain: longint; 
                      OutputImpedance: double; Repeat_, Triggered: longint; 
                     OverrideOtherClocks: longint): longint; stdcall; external 'E_l80.dll';

现在,正如您可能看到的,我将类型更改为Delphi等效,至少据我所知,我是以正确的方式进行的。

如果有人知道回答任何这些事情,或者看到任何错误,我会很高兴在评论/答案中看到。

如果我对此定义不好,请指出正确的方向,并给我一个提示,而不是评论我的错误。他们有点不帮......:/

非常感谢。

1 个答案:

答案 0 :(得分:2)

查看DLL的实际.h文件而不是文档会更有用,因为文档往往没有提到调用约定实际上是什么(并且这种情况也不例外)。您将Delphi函数声明为stdcall,其中可能或不可能正确。 cdecl是DLL中另一种常用的调用约定,特别是因为它是C的默认调用约定。因此,如果函数未在.h文件中使用任何显式调用约定声明,则假设为cdecl而不是stdcall。对于本次讨论,我将假设cdecl,除非另有说明。

  

int SetAnalogChannels(int CH1Gain,int CH2Gain,bool CH1Couple,bool CH2Couple,bool CH1Multiplier,bool CH2Multiplier)

function SetAnalogChannels(CH1Gain, CH2Gain: Integer; CH1Couple, CH2Couple, CH1Multiplier, CH2Multiplier: Boolean): Integer; cdecl; external 'E_l80.dll';
  

long RetrieveDSOData(unsigned char whatchannels,double * DSOCH1,double * DSOCH2,unsigned short * LADATA,unsigned char Nth_Sample)

正如文档所述,这些是指向数组的指针。我会按原样翻译它们,不要试图将它们转换成任何花哨的Delphi语法:

function RetrieveDSOData(whatchannels: Byte; DSOCH1, DSOCH2: PDouble; LADATA: PWord; Nth_Sample: Byte): longint; cdecl; external 'E_l80.dll';
  

float SetUPPS1(浮动电压)

您将此转换为Extended,这是错误的。德尔福的Single相当于C float

function SetUPPS1(Voltage: Single): Single; cdecl; external 'E_l80.dll';
  

long SetupAWG(double * AnalogVoltage,short * DigitalData,long BufferSize,double DCOffsetVoltage,double SampleFrequency,long Use4xGain,double OutputImpedance,long Repeat,long Triggered,long OverrideOtherClocks)

与数组相同:

function SetupAWG(AnalogVoltage: PDouble; DigitalData: PShort; BufferSize: Longint; DCOffsetVoltage, SampleFrequency: Double; Use4xGain: Longint; OutputImpedance: Double; Repeat, Triggered, OverrideOtherClocks: Longint): longint; external 'E_l80.dll';