来源:远方网络 | 2005-12-29 14:15:32 | (有6907人读过)
我想用Delphi调用C语言编写的DLL,但DLL中的函数中有 数组指针 参数。
我希望能用Delphi声明并调用数组指针,但作了几个程序包括下边这个都不能的到正确结果。
希望各位高手指点迷津。
DLL中
C语言函数声明如下:
long ASmpe ( long *idnum,
long demo,
long *stateIO,
long updateIO,
long ledOn,
long numChannels,
long *channels,
long *gains,
long disableCal,
long *overVoltage,
float *voltages )
gains,Channels ,voltages,为数组指针,各有四个单元。即指向的数组长度为四。
其余各参数可是固定值,分别为0或1。
我用Delphi 作驱动程序该函数声名如下:
unit driver;
interface
uses windows;
function AISample(var idnum:integer;demo:integer;var
stateIO:integer;updateIO:integer;
ledOn:integer;numChannels:integer;var MAIchannels:array of integer;
var MAIgains:array of integer;disableCal:integer;var overVoltage:integer;
var MAIvoltages:array of single):integer;stdcall;
implementation
function AISample; external 'ljackuw.dll';
在主程序timer 组件中调用此函数(有返回值):
procedure TForm1.Timer1Timer(Sender: TObject);
var
idnum,demo,stateIO,updateIO,ledOn,numChannels,disableCal,overvoltage:integer;
MAIchannel: array of integer;
MAIgain: array of integer;
MAIvoltage: array of single;
begin
(设定动态数组长度)
setlength(MAIchannel,4);
setlength(MAIgain,4);
setlength(MAIvoltage,4);
(初始化动态数组)
MAIchannel[0]:=channel1.ItemIndex;
MAIchannel[1]:=channel2.ItemIndex;
MAIchannel[2]:=channel3.ItemIndex;
MAIchannel[3]:=channel4.ItemIndex;
MAIgain[0]:=gain1.ItemIndex;
MAIgain[1]:=gain2.ItemIndex;
MAIgain[2]:=gain3.ItemIndex;
MAIgain[3]:=gain4.ItemIndex;
{其余各参数各设为0 或1}
rc:=AISample(idnum,demo,stateIO,updateIO,ledOn,numChannels,MAIchannel,
MAIgain,disableCal,overVoltage,MAIvoltage);
(返回值)
voltage1.text:=floattostr(MAIvoltage[0]);
voltage2.Text:=floattostr(MAIvoltage[1]);
voltage3.text:=floattostr(MAIvoltage[2]);
voltage4.Text:=floattostr(MAIvoltage[3]);
end; ------------------------------------------------------------------------------------ 答复: 把: rc:=AISample(idnum, demo, stateIO, updateIO, ledOn, numChannels, MAIchannel, MAIgain, disableCal, overVoltage, MAIvoltage);
改为: rc:=AISample(idnum, demo, stateIO, updateIO, ledOn, numChannels, MAIchannel[0], MAIgain[0], disableCal, overVoltage, MAIvoltage[0]);
当然,最好不要用动态数组,我比较倾向于这样用: var MAIchannel : array[0..3] of Cardinal;
(长度为4时才可以). 另外,Delphi里的Integer是与C里的long不同的,建议用Cardinal
--------------------------------------------------------------------------------- 多谢版主指点
只是我改了程序,运行后还是不能得到正确的输出电压值。
是不是我用Delphi 声明C语言数组指针参数的格式不对。
例如:C编的函数中参数 long *voltage 为数组指针
Delphi 中声明该参数用 var voltage array of cardinal 是否正确
|