在Delphi中调用C ++ DLL的问题

时间:2012-07-03 16:44:01

标签: c delphi labview

我在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

1 个答案:

答案 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.