解決策
LabVIEWは、DLLのコールバック関数として使用するためにVIにポインタをネイティブに渡すことはできません。
ただし、 このシナリオでは回避策としてCベースのラッパーを使用できます。Cラッパーは、LabVIEWのAPIとDLLのパラメータ間のインタフェースを提供するために使用されます。
- LabVIEWでユーザイベントを作成し、それをイベントストラクチャに登録します。イベントストラクチャは、登録されたユーザイベントのアサーション時に目的のコールバックVIを実行します。
- ラッパーDLLは、LabVIEWからライブラリ関数呼び出しノードを介してこのイベントRefnumを取得してから、このイベントRefnumを使用してC関数を呼び出すメソッド(例:myWrapperMethod)を実装します。PostLVUserEventと呼ばれます。
- myWrapperMethodの内部では、PostLVUserEventは2つの入力パラメータ、ref(LabVIEWイベントrefnum)とdata(voidへのポインタ)を受け取ります。dataは、元のDLLからのVIコールバック関数に渡す必要のあるデータ出力です。
- メモ: DLLの出力をLabVIEW互換のデータタイプに変換するには、ラッパーレイヤでdataの型変換や構文解析が必要になる場合があります。これに関する詳細情報については、アプリケーション特有であるため、DLLのヘッダファイルを確認してください。
- ラッパーのmain関数に1行追加して元のDLLを呼び出し、ラッパーメソッドmyWrapperMethodへのポインタをDLLのコールバック関数パラメータとして渡します。
- 元のDLLがコールスタックのポインタをコールバック関数アドレスに設定すると、ラッパー関数myWrapperMethodが呼び出され、LabVIEWでPostLVUserEventを介して指定されたユーザイベントがトリガされます。
- これにより、目的のコールバックVIに関連付けられたイベントケースが実行され、dataパラメータを介して関連データがLabVIEWに返されます。