所以,正如标题所说,我正在努力翻译一些函数来调用DLL,我在C中有文档,但我需要在Delphi中使用它。
经过几次初步尝试,在翻译后解决了一些编译错误后,在你们(topic here)的帮助下,其中一些仍然无效。主要是变量作为参数的问题......
首先是主题:我买了一台由一些捷克公司制造的USB逻辑分析仪和示波器,它配备了相当基础和有限的软件,但有一个DLL和(差)文档,介绍如何在我们自己的应用程序中实现它为了与分析仪进行通信。
现在,本文档(found here)有几个函数,用C编写(下面的代码段落1)。我已将它们全部翻译成Delphi(下面的代码段落2),但只有大约一半的人工作。
我需要一些帮助来确定问题所在:
注意:使用原始软件,所有功能和所有数据通信都能正常工作!因此,我认为可以安全地假设所有不工作的都是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等效,至少据我所知,我是以正确的方式进行的。
如果有人知道回答任何这些事情,或者看到任何错误,我会很高兴在评论/答案中看到。
如果我对此定义不好,请指出正确的方向,并给我一个提示,而不是评论我的错误。他们有点不帮......:/
非常感谢。
答案 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';