我在delphi中调用C ++ DLL时遇到一些问题,DLL是用Labview编写的,但DLL语法都是C ++,我认为主要问题是尝试将数据作为动态传递给函数double的数组(本身就是指针对吗?)
.h头文件中的函数定义是:
int16_t __cdecl NRELIVparExtract(
double voltageV[],
double currentA[],
int32_t nDataPoints,
uint16_t fitAlgorithim,
int16_t *twoOrLessPoints,
double *Voc,
double *Isc,
double *Vmp,
double *Imp
);
我尝试使用的delphi代码是:
public { Public declarations }
end;
var
Function NRELIVparExtract (voltageV, currentA: Array of Double; nDataPoints :Integer;
fitAlgorithim :Word; Var twoOrLessPoints : SmallInt;
Voc, Isc, Vmp, Imp : Double): smallint ; CDecl;External IVparExtract_NREL.dll'
嗒嗒
procedure TFormMainIVanalysis.ExtractNREL(InputFileName : ShortString);
var
VoltArray, CurrArray : Array Of double;
blah
Begin
NRELresult := NRELIVparExtract(VoltArray,CurrArray,NpointsForFitting, fitAlgorithm, twoOrLessPoints, LVoc, LISc, LVmpp, LImpp);
当编译器到达我的delphi .dpr中的开始行时,我不同地得到访问冲突错误或者我找不到IVparExtract_NREL.dll
任何建议都非常欢迎,欢呼,Brian
答案 0 :(得分:8)
C类型double[]
不转换为Delphi类型array of Double
。 Delphi类型是一个开放数组,它实际上在内部转换为两个参数,一个指向第一个元素的指针,以及一个整数,其中一个小于一个元素的数量。阵列。相反,你应该像C一样做,并将数组“衰减”为一个简单的指针。
C类型double*
未转换为Delphi类型Double
。它是一个指针,因此将参数类型声明为指针。
那应该给你以下声明:
function NRELIVparExtract(voltageV, currentA: PDouble; nDataPoints: Integer;
fitAlgorithim: Word; var twoOrLessPoints: SmallInt;
Voc, Isc, Vmp, Imp: PDouble): SmallInt; cdecl;
external 'IVparExtract_NREL.dll';
如果您的程序找不到DLL,那么您应该确保您的DLL位于操作系统将查找它的位置,例如程序的目录,或系统路径上的某个位置。 MSDN has the details on the library search order.