我在delphi中调用C++ DLL时遇到一些问题,DLL是用Labview编写的,但DLL语法都是C++,我认为主要问题是尝试将数据作为动态数组传递给函数(其中本来就是一个指针对吗?)
.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
);
Run Code Online (Sandbox Code Playgroud)
我试图用来调用它的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'
Run Code Online (Sandbox Code Playgroud)
胡说
procedure TFormMainIVanalysis.ExtractNREL(InputFileName : ShortString);
var
VoltArray, CurrArray : Array Of double;
blah
Begin
NRELresult := NRELIVparExtract(VoltArray,CurrArray,NpointsForFitting, fitAlgorithm, twoOrLessPoints, LVoc, LISc, LVmpp, LImpp);
Run Code Online (Sandbox Code Playgroud)
当编译器到达我的delphi .dpr中的开始行时,我不同地得到访问冲突错误或者我找不到IVparExtract_NREL.dll
任何建议都非常欢迎,欢呼,布赖恩
C类型double[]并没有转换为德尔福类型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';
Run Code Online (Sandbox Code Playgroud)
如果您的程序找不到DLL,那么您应该确保您的DLL位于操作系统将查找它的位置,例如程序的目录,或系统路径上的某个位置.MSDN具有库搜索顺序的详细信息.