Community Documents

cancel
Showing results for 
Search instead for 
Did you mean: 

LabVIEW から C/C++ で作成された DLL を呼び出す

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

 

 

はじめに: ライブラリ関数呼び出しノード

LabVIEWでは、ライブラリ関数呼び出しノードを使用することで、CやC++で作成されたDLLを呼び出すことができます。ライブラリ関数呼び出しノードでは、使用するDLLやそのDLLの中から呼び出す関数を選択したり、関数の入力と出力(引数と戻り値)を構成することができます。

 

Configuring the Call Library Function Node

チュートリアル:シンプルなDLLを呼び出すためにライブラリ関数呼び出しノードを構成する

 

共有ライブラリをインポートウィザード

共有ライブラリをインポートウィザード (Import Shared Library Wizard) は、インポートするDLLのために構成されたライブラリ関数呼び出しノードを含むラッパーVIを自動的に作成し、C/C++のDLLを呼び出す作業を効率化します。

 

このWizardを使用してラッパーVIを作成するためには、DLLのヘッダファイルが必要です。このWizardが正しい入出力を持つラッパーVIを作成するためにヘッダーファイルが必要です。
チュートリアル: 共有ライブラリをインポートウィザードで C/C++ の DLL 関数のラッパーVIを作成する

 

メモ:共有ライブラリをインポートウィザードは、シンプルなデータタイプや、シンプルなデータタイプを含む構造体を使用するDLL関数のラッパーVIを作成することには長けていますが、下記の制限があります:

  • ポインタと配列の区別:配列は、先頭要素へのポインタであるため、共有ライブラリをインポートウィザードは区別ができません。
  • 戻り値の型:ライブラリ関数呼び出しノードは、void、integer、とstringの戻り値のみを受け付けるため、構造体などの複雑な戻り値はポインタとして渡す必要があります。
  • ポインタ:複雑なデータタイプへのポインタや、戻り値として戻されるポインタはデリファレンスされていない可能性があります(戻り値としてその要素のメモリアドレスを示す整数が返されます)。

 

これらの注意事項の詳細は下記の記事に記載されています。記事ではこれらを回避するための例も紹介しています。
様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す

 

構造体をクラスタとして表す

LabVIEWでは構造体をLabVIEWクラスタとして表します。C/C++の構造体と同じように、クラスタの要素の順位付けがそのままメモリに格納される順番となるため重要です。構造体を受け付けるDLLにクラスタを渡すためには、クラスタ内の要素の順位が構造体の要素の順序と一致するか確認してください。

 

例:

Structs.png

クラスタの要素に不適切な順位付けがされている場合、並び替えをすることが可能です。

クラスタ要素の順位を変更する

 

LabVIEWから構造体を受け付ける、または戻すC/C++関数を呼び出すサンプルは下記の記事に記載されています。

様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す

 

ポインタとリファレンス

CやC++など複数の言語では、ポインタ、つまり、関心のあるデータのメモリアドレスを持つ(ポイントする)変数、の概念が存在します。これは複数の値を戻す必要がある関数で多く見られます。このような場合、プログラマーは参照呼びと呼ばれる実際の値ではなく値へのポインタを引数にするテクニックを使います。

 

LabVIEWではC#やJavaのように、ユーザにポインタの概念やメモリ割り当てを制限しているため、ポインタの扱いははじめは難しく感じるかもしれません。

 

LabVIEWからポインタをC/C++のDLLに渡したり、C/C++のDLLからポインタを受けたりデリファレンスすることが可能です。詳細は下記の記事に記載されています。

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

LabVIEW で C/C++ の DLL からのポインタをデリファレンスする

 

サンプル

LabVIEWからC/C++のDLLを呼び出し、様々なデータタイプ(数値、文字列や配列からポインタや構造体・クラスタ)をLabVIEWとDLL間で渡す方法は下記の記事にまとめてられています。

様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す

 

その他の記事

チュートリアル:シンプルなDLLを呼び出すためにライブラリ関数呼び出しノードを構成する

チュートリアル: 共有ライブラリをインポートウィザードで C/C++ の DLL 関数のラッパーVIを作成する

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

LabVIEW で C/C++ の DLL からのポインタをデリファレンスする

様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す