LabVIEWでDLLにコールバック関数のポインタを渡す

更新しました Aug 31, 2023

使用製品

ソフトウェア

  • LabVIEW

問題

LabVIEWで呼び出す必要があるコールバック関数へのポインタを含む関数プロトタイプを持つDLLがあります。そのコールバック関数ポインタにメモリ内のVIを参照させたいです。LabVIEWでこのDLLを呼び出し、コールバック関数パラメータとしてVIへのポインタを渡すにはどうすればよいですか?

解決策

LabVIEWは、DLLのコールバック関数として使用するためにVIにポインタをネイティブに渡すことはできません。
 

ただし、 このシナリオでは回避策としてCベースのラッパーを使用できます。Cラッパーは、LabVIEWのAPIとDLLのパラメータ間のインタフェースを提供するために使用されます。
 

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