注釈: この記事は、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を作成することには長けていますが、下記の制限があります:
これらの注意事項の詳細は下記の記事に記載されています。記事ではこれらを回避するための例も紹介しています。
様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す
LabVIEWでは構造体をLabVIEWクラスタとして表します。C/C++の構造体と同じように、クラスタの要素の順位付けがそのままメモリに格納される順番となるため重要です。構造体を受け付けるDLLにクラスタを渡すためには、クラスタ内の要素の順位が構造体の要素の順序と一致するか確認してください。
例:
クラスタの要素に不適切な順位付けがされている場合、並び替えをすることが可能です。
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 にポインタを渡したり受け取る