2

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

私がそれを呼び出すために使用しようとしている私のデルファイコードは次のとおりです:

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タイプはDelphiタイプに変換されdouble[]ませarray of Double。Delphiタイプはオープン配列であり、実際には内部で2つのパラメーター、最初の要素へのポインター、および配列内の要素数より1つ少ない整数を変換します。代わりに、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を見つけられない場合は、プログラムのディレクトリなど、OSがDLLを探す場所、またはシステムパス上のどこかにDLLが存在することを確認する必要があります。MSDNには、ライブラリの検索順序に関する詳細があります。

于 2012-07-03T17:41:59.690 に答える