Debugging Calls to Shared Libraries
- 更新日2026-06-12
- 11分で読める
Debug LabVIEW shared library calls by troubleshooting the functionality of your library and your Call Library Function Node configuration.
ライブラリ関数呼び出しノードのトラブルシューティング
LabVIEWで共有ライブラリを呼び出す際にエラーが発生した場合は、ライブラリ関数呼び出しノードが正しく構成されているかどうか、以下の問題を確認してください。
- 「ライブラリ関数呼び出しノード」に共有ライブラリの名前またはパスが正しいことを確認してください。また、ディスク上の場所を用途に応じて適切に指定してください。共有ライブラリをパスで指定する必要がある用途と、共有ライブラリを名前で指定する必要がある用途があります。
- LabVIEWで作成された共有ライブラリについては、共有ライブラリの作成に使用されたLabVIEWの各バージョンと互換性のあるLabVIEWランタイムエンジンがコンピュータにインストールされていることを確認してください。
- ライブラリで関数が見つかりませんというエラーメッセージが表示された場合は、ライブラリ関数呼び出しノードが呼び出している関数名のスペル、構文、および大文字と小文字を区別していることを確認してください。
- コンパイラにより関数名が修飾されていないことを確認します。
- 「ライブラリ関数呼び出しノード」でプライマリ共有ライブラリへのパスが正しく指定されているにもかかわらず、セカンダリ共有ライブラリが見つからないというエラーメッセージが表示された場合、プライマリ共有ライブラリには1つまたは複数の他の共有ライブラリからの追加関数が必要です。他の共有ライブラリを見つけ、それらを必要とする共有ライブラリと同じディレクトリ、または検索パスにあるディレクトリに配置する必要があります。詳細については、ni.comの技術サポートデータベースを参照してください。
- VIがクラッシュした場合は、ライブラリ関数呼び出しノードの関数の引数の戻り値タイプとデータタイプが、関数が使用するデータタイプと完全に一致していることを確認してください。また、「ライブラリ関数呼び出しノード」が適切な呼び出し規約 (「ライブラリ関数呼び出し」ダイアログボックスの「エラーチェックレベル」タブを使用して、Cまたは__stdcall) を使用していることを確認します。
- すべてのパラメータが、正しい方法 (値やポインタなど) により渡されるように定義されていることを確認します。また、「ライブラリ関数呼び出しノード」が正しい順序で関数に引数を渡すことを確認します。
- データの配列または文字列の場合、関数が結果を格納するのに十分な大きさのバッファまたは配列を渡す。ただし、LabVIEWハンドルとして渡す場合は、LabVIEWマネージャ関数を使用してVisual C++またはXcodeコンパイラの下でサイズ変更します。
- メッセージを受け取った場合、ほとんどの場合、配列に割り当てられたメモリの末尾を超えた書き込みなど、共有ライブラリのコードのエラーが原因です。このタイプのクラッシュは、共有ライブラリ呼び出しが実際にブロックダイアグラム上で実行する時点では発生しない可能性があります。
- ActiveXオブジェクトを含む共有ライブラリを呼び出すには、「オートメーションオープン」関数を「ライブラリ関数呼び出しノード」の代わりにプロパティノードおよびインボークノードと共に使用してください。
- LabVIEWで作成された共有ライブラリへの呼び出しのすべては、任意のスレッドで実行を指定するはずです。LabVIEWで作成された共有ライブラリを使用してライブラリ関数呼び出しノードを構成して、UIスレッドで実行を構成すると、LabVIEWがフリーズして、コンピュータを再起動する必要がある場合があります。
- パスカル文字列の長さが255文字を超えていない。
- 配列および文字列のサイズ変更は、ライブラリ関数呼び出しノードがLabVIEW配列ハンドルまたはLabVIEW文字列ハンドルを渡した場合にのみ実行できます。labviewv.libを介してVisual C++プロジェクトに、liblvexports.aを介してXcodeプロジェクトにエクスポートされた関数を使用して配列と文字列のサイズを変更します。
- C文字列はNULLで終端されていることに注意してください。DLL関数がGPIBやシリアルポートなどを介してバイナリ文字列形式で数値データを返す場合、データ文字列の一部としてNULL値を返す場合があります。
共有ライブラリのトラブルシューティング
LabVIEWで共有ライブラリを呼び出す際にエラーが発生した場合は、以下のヒントを参照して呼び出している共有ライブラリに問題がないことを確認してください。
- 他のアプリケーションが呼び出す共有ライブラリ関数がモジュール定義ファイルEXPORTSセクションに表示されているか、関数宣言に_declspec (dllexport)キーワードが含まれていることを確認してください。C++コンパイラでのマングル処理と呼ばれるプロセスにより、エクスポートされた関数名にプラットフォーム依存が発生することを避けるため、ヘッダファイルで、以下のサンプルコードのようにC++コンパイラ関数エクスポート指令でextern "C"{}を使用してください。
extern "C" {
/* your function prototypes here */
}
- 関数をヘッダファイルとソースコードで_declspec (dllexport)キーワードで宣言するか、モジュール定義ファイルのEXPORTSセクションで定義する必要があります。
- _declspec (dllexport)キーワードを使用し、__stdcall呼び出し規約も使用する場合、モジュール定義.defファイルのEXPORTSセクションで共有ライブラリ関数名を宣言する必要があります。.defファイルがない場合、__stdcallは予期しないパターンで関数名を切り捨てる可能性があるため、共有ライブラリを呼び出すアプリケーションで実際の関数名を使用できません。
- 関数が正しくエクスポートされていない場合、共有ライブラリを再コンパイルする必要があります。共有ライブラリが他のアプリケーション (VIなど) によってメモリにロードされている間は、共有ライブラリを再コンパイルしないでください。共有ライブラリを再コンパイルする前に、共有ライブラリを使用しているすべてのアプリケーションがメモリからアンロードされていることを確認してください。これは、再コンパイル中に共有ライブラリ自体がメモリにロードされることを防ぐためです。この点を忘れ、コンパイラが警告しない場合、共有ライブラリが正しく再構築されない可能性があります。ただし、ほとんどのコンパイラは、共有ライブラリがアプリケーションによって使用されているときに警告を表示します。
- コンパイラに付属のソースレベルデバッガを使用して、共有ライブラリをデバッグしてみてください。コンパイラのデバッガを使用して、ブレークポイントの設定、コードのステップ実行、変数の値の監視などを行うことができます。従来のツールを使用したデバッグは非常に有益です。デバッグの詳細については、コンパイラの適切なマニュアルを参照してください。
- 他のCプログラムから共有ライブラリを呼び出すことも、共有ライブラリをデバッグする別の方法です。別のCプログラムから共有ライブラリを呼び出すことで、LabVIEWから独立して共有ライブラリをテストすることができるため、問題を早期に特定できます。
- 2D配列を渡すLabVIEW共有ライブラリを呼び出す場合、次のCコードに示すように、ハンドラ変数を宣言し、変数をNULLに初期化する必要があります。
主要
{
/*LabVIEW data handler variable for the array */
TD1Hd1myArray = NULL;
...
/* Call to the LabVIEW shared library function */
DLLFunctionalCall(&myArray);
...
}
ハンドラ変数をNULLに初期化しないと、共有ライブラリを呼び出す際に一般保護障害が発生します。 - LabVIEW 共有ライブラリ関数を中断なく実行できるように、LabVIEW は共有ライブラリ関数の呼び出しが終了するか、共有ライブラリからモーダルウィンドウがロードされるまでオペレーティングシステムメッセージの処理を遅延させます。オペレーティングシステムのメッセージ (キーボードによるユーザからのメッセージ) は、共有ライブラリ関数で使用中の共有ライブラリファイルが呼び出されないように遅延させる必要が生じる場合があります。たとえば、ユーザがボタンを押したために共有ライブラリ関数が呼び出された場合、この関数が完了するまではユーザが再度同じボタンを押すことを禁止する必要があります。LabVIEWがオペレーティングシステムメッセージの処理を遅延すると、同じLabVIEW共有ライブラリへのすべての関数呼び出しがキューに入れられます。そのキューは、元の共有ライブラリ関数呼び出しが完了した後に実行されます。モーダルウィンドウは、アクティブのままで残る、またはユーザがウィンドウを閉じるか、別のモーダルウィンドウを開くまで他のすべてのLabVIEWウィンドウ上に残るタイプのウィンドウです。共有ライブラリからモーダルウィンドウをロードする場合、LabVIEWはプロセス遅延を無視して、モーダルウィンドウがアクティブになるようにメッセージを処理します。モーダルウィンドウが開いている間は他のウィンドウは操作できません。LabVIEWのほとんどのダイアログボックスはモーダルウィンドウです。別のプロセスが実行中の際には、LabVIEWコールバックVIまたは共有ライブラリから非モーダルウィンドウを開くことはできません。コールバックVIまたは共有ライブラリで非モーダルウィンドウを呼び出すには、「コールバックVI」トピックで説明されている手順をプログラム的に実行する必要があります。
- ビルドした共有ライブラリのオペレーティングシステムメッセージを遅延するかどうかを選択できます。共有ライブラリを作成する前に、共有ライブラリプロパティダイアログボックスの上級ページに移動し、共有ライブラリのオペレーティングシステムメッセージを遅延チェックボックスをオフにして、共有ライブラリ関数の実行中にオペレーティングシステムメッセージを処理します。
- 以下の例は、デバッグ可能なアプリケーションまたはランタイムライブラリが見つかりませんでしたというエラーが発生する可能性があります。
- デバッグ可能な共有ライブラリがロードされていないか、アプリケーションによってアンロードされました。
- アプリケーションビルダで作成された共有ライブラリの構成 (ini) ファイルは、共有ライブラリとともに配布されませんでした。
関連コンテンツ
- LabVIEWでの共有ライブラリの呼び出し
ライブラリ関数呼び出しノードを使用して、LabVIEWで標準の共有ライブラリを呼び出します。「オートメーションオープン」関数をプロパティノードおよびインボークノードと一緒に使用して、ActiveXオブジェクトを含む共有ライブラリを呼び出します。構成とデバッグのガイダンスを含む、一般的なワークフローを確認します。
- Configuring the Call Library Function Node
- Call Library Function Node - LabVIEW Programming Reference Manual
- Call Library Function Dialog Box - LabVIEW Programming Reference Manual
- LabVIEW Manager Functions - LabVIEW Programming Reference Manual
- Specifying the Location of Shared Libraries on Disk
- LabVIEWランタイムエンジンを使用する
- 関数プロトタイプを作成する
- Automation Open Function - LabVIEW Programming Reference Manual
- ActiveXコンテナの概要
ActiveXコンテナを使用して、ActiveXコントロールまたはドキュメントをLabVIEW VIフロントパネルに埋め込みます。
- コールバックVI
コールバックVIには、指定したActiveXまたは.NETイベントを処理するために作成するコードが含まれています。
- Shared Library Properties Dialog Box - LabVIEW Programming Reference Manual