在BCB中,一DLL定义如下:
//波形参数
typedef struct
{
unsigned int mDots; //波形点数
double mDacclk; //时钟
double mWaveData[2*262144]; //波形数据
double mNoise[2*262144];
double mGenWave[2*262144];
}WavePara;
//计算规则波形的波形数据:如时钟,波形点数
void __stdcall LAI300_CacuWavePara(
int WaveType,
int xCycles,
int yCycles,
double Frequency,
double Amplitude,
double Offset,
double Duty,
unsigned int *mDots,
double *mDacclk,
double *mWaveData,
double kr,
double kf,
double phase
);
其调用:
WavePara CH[1]; // 卡波形参数
//计算规则波形的波形数据
LAI300_CacuWavePara(
mType, //波类型
mNumber, //个数
0,
mFreq, //频率
mAmplitude, //幅度
mOffset, //偏移
mDuty, //占空比
&CH[0].mDots, //波形点数
&CH[0].mDacclk, //时钟
CH[0].mWaveData, //波形数据
mKr/100, //上升时间
mKf/100, //下降时间
mPhase //相位
);
在Delphi中定义如下:刚开始定义成下列样子始终通不过,连Application.Initialize都通不过,更不用说去看堆栈哪里出错了,又没查到BCB指针
参数在Delphi中的定义方法,
//计算规则波形的波形数据:如时钟,波形点数
procedure LAI300_CacuWavePara(
WaveType:integer;
xCycles:integer;
yCycles:integer;
Frequency:double;
Amplitude:double;
Offset:double;
Duty:double;
mDots:PLongWord;
mDacclk:PDouble;
mWaveData:array of double;
kr:Double;
kf:Double;
phase:Double
)stdcall
在人家的Blog 中看到这样的讨论:
vc,dll中的函数原型为int f1(int ch, BYTE* aa),在vb中怎样声明,如何调用
declare function f1 lib "vc.dll" (byval ch as long,byref aa as byte) as long
sub main()dim n as byte
dim lRet as long
lRet = f1(1, n)
end sub
而VB中byref aa as byte转换为delphi中就是var aa:byte,也就是说vc中定义的double *mWaveData,其实用var mWaveData:double
就行,很少见到用mWaveData:PDouble这样的定义,但如果要传一个数组的首地址进去,用PDouble这种方法很方便,通过下面的程序证明我这
个推断是正确的.
定义:
//波形参数
type
WavePara=record
mDots:LongWord; //波形点数
mDacclk:Double; //时钟
mWaveData:array [0..2*262144-1]of double; //波形数据
mNoise:array[0..2*262144-1]of double;
mGenWave:array[0..2*262144-1]of double;
end;
procedure LAI300_CacuWavePara(
WaveType:integer;
xCycles:integer;
yCycles:integer;
Frequency:double;
Amplitude:double;
Offset:double;
Duty:double;
var mDots:LongWord;
var mDacclk:Double;
mWaveData:PDouble;
kr:Double;
kf:Double;
phase:Double
)stdcall;
调用:
var
CH:array[0..1]of WavePara;
//计算规则波形的波形数据
LAI300_CacuWavePara(
mType, //波类型
mNumber, //个数
0,
mFreq, //频率
mAmplitude, //幅度
mOffset, //偏移
mDuty, //占空比
CH[0].mDots, //波形点数
CH[0].mDacclk, //时钟
@CH[0].mWaveData, //波形数据
mKr/100, //上升时间
mKf/100, //下降时间
mPhase //相位
);
其参数中用var 就表示传变量地址
还有,在函数定义中,如果要求传数组首地址参数,最好是用Data:Pdouble指针形式,这样,不用但心堆栈溢出,否则,如果用动态数组做为参数,
如果定义的数组过大,传进去可能发生堆栈溢出,出现函数调用失败