2

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

我试图用来调用它的德尔福代码是:

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 未找到

非常欢迎任何建议,干杯,布赖恩

4

1 回答 1

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 有关于图书馆搜索顺序的详细信息。

于 2012-07-03T17:41:59.690 回答