From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Community Documents

cancel
Showing results for 
Search instead for 
Did you mean: 

LabVIEW で C/C++ の DLL にポインタを渡したり受け取る

注釈: この記事は、Passing and Receiving Pointers with C/C++ DLLs from LabVIEW を翻訳したものです。内容に相違がある場合、英語の資料が正文となっております。

ポインタを渡す

CやC++の関数は多くの場合、関数プロトタイプでポインタを受け付けます。ポインタとはメモリアドレスを表す整数値です。

ポインタをDLLに渡す、つまり値のメモリアドレスをLabVIEWからDLLに渡すためには、ライブラリ関数呼び出しノードを構成して値を参照渡しする必要があります。ただし、LabVIEWはデータのメモリ割り当てを公開しないため、メモリアドレスを直接渡すことはできません。

整数(とほかのプリミティブ型)のポインタを渡す

下記のライブラリ関数呼び出しノードの構成は、整数値へのポインタを受け付ける関数に適応できます。パスリストボックスを、値へのポインタに変更します。

void ReturningValuesByReference_Integer(int x, int y, int *sum);
9080-1.png

配列を渡す

C/C++では、配列はポインタとして定義されています。これは、配列変数が配列の先頭要素のメモリアドレスを保持していることを示します。

下記のライブラリ関数呼び出しノードの構成は、整数配列を受け付ける関数に適応できます。タイプ配列に設定します。適切な配列のデータタイプを指定し(この場合は整数)、配列フォーマットをデフォルトの配列データポインタにします。

int PassingParamters_ArrayOfIntegers (int x[], int length);
9080-2.png

文字列へのポインタを渡す

文字列は、charタイプの配列として定義されているため特殊です。このため、文字列は既に参照渡しされています。

下記のライブラリ関数呼び出しノードの構成は、文字列入力を受け付ける関数に適応できます。文字列フォーマットをデフォルトのC文字列ポインタにします。

int PassingParamters_String (char *str);

9080-3.png

構造体・構造体へのポインタを渡す

下記のライブラリ関数呼び出しノードの構成は、構造体と構造体へのポインタを受け付ける関数に適応できます。構造体を渡すためには、構造体の要素を順番に渡し、構造体へのポインタは、構造体を表すクラスタを入力し、タイプタイプに適応データフォーマット値へのハンドルに設定します。

void ReturningValuesByReference_SimpleStruct (struct simpleStructCircle circle, struct simpleStructCircle *largerCircle);
9080-4.png

ポインタを受け取る

C/C++のDLLは要求された値のメモリ位置へのポインタを使用してデータを返します。これには2通りの方法があります。

1. ポインタを戻す: 下記のように、ポインタが関数の戻り値として返されます。

int * ReturnAValue_PointerToInteger(void)

{

     int *x = (int *) malloc(sizeof(int));

     *x = 5;

     return x;

}

ライブラリ関数呼び出しノードは、整数、文字列、とvoidタイプの戻り値のみを返すため、ポインタをメモリアドレスを表す整数として受け取り、手動でポインタをデリファレンスして値を取得する必要があります。
詳しくは ポインタをメモリアドレスとして受け取り手動でデリファレンスセクションを参照してください。

2. 参照渡し: ポインタが関数の引数を通して返されます。

void ReturningValuesByReference_Integer (int x, int y, int *sum)
{
     //sum is a pointer
     *sum = x + y;
}

返されるデータタイプにより、自動的にポインタをデリファレンスする(数値やシンプルな構造体など)、もしくはポインタをメモリアドレスを表す整数として受け取り、手動でポインタをデリファレンスして値を取得します。
詳しくは ポインタをメモリアドレスとして受け取り手動でデリファレンスポインタを受け取り自動的にデリファレンスセクションを参照してください。

ポインタを受け取り自動的にデリファレンス

ライブラリ関数呼び出しノードは、数値やシンプルな構造体などのLabVIEWの一般的なデータタイプへのポインタを自動的にデリファレンスすることが可能です。この方法は、DLLにポインタを渡す方法とまったく同じで、引数を入力ではなく出力として扱います。
9080-1.png

ポインタをメモリアドレスとして受け取り手動でデリファレンス

ポインタを受け取るためには、ライブラリ関数呼び出しノードを整数値を受け取れるように構成します。この整数値がメモリアドレスです。値を取得するためには、このメモリアドレスをデリファレンスする必要があります。

ライブラリ関数呼び出しノードでポインタを受け取るように構成するためには、タイプ数値データタイプ符号付きポインタサイズ整数に設定します。ポインタサイズ整数は、ライブラリ関数呼び出しノードでOSやLabVIEWにより、自動的にポインタサイズ(32ビットか64ビット)を決定します。
メモ:この入力に32ビット整数を配線すると、32ビットOSでも強制ドットが発生します。
9080-5.png

ポインタをデリファレンスする(ポインタが指す値を受け取る)方法の詳細は、下記の記事に記載されています。
LabVIEW で C/C++ の DLL からのポインタをデリファレンスする

まとめ・次のステップ

LabVIEWでポインタをデリファレンスする方法や特殊なケースについては、下記の記事に記載されています。
LabVIEW で C/C++ の DLL からのポインタをデリファレンスする

ポインタを上記の方法で扱うサンプルは、下記の記事に記載されています。
様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す

Contributors