LabVIEWのライブラリ関数呼び出しノードを使用してDLL関数にアクセスし、この関数がVIに表示される文字列を返すようにしたいと考えています。どうすればこれを行うことができますか?私は自分の DLL から数値を返すことに非常に満足していますが、文字列を返す方法の例を見つけるのに本当に苦労しています。
2 に答える
ライブラリ関数呼び出しノードから文字列を返すには、少なくともいくつかの方法があります。
DLL 関数から C 文字列ポインターを返し、「C 文字列ポインター」の戻り型を持つようにライブラリ関数呼び出しノードを構成します。返される文字列は、関数が返された後に有効である必要があるため、スタックに割り当てられた文字列へのポインターにすることはできません。次のいずれかである必要があります: ヒープに割り当てられた、静的に割り当てられた、定数文字列リテラルなど。
examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi
LabVIEWディレクトリではこのアプローチを採用しているようです。VIに文字列を割り当て、Azimが提案したように「C文字列ポインタ」パラメータを使用してライブラリ関数呼び出しノードに渡し、その内容をDLLで上書きします。文字列を割り当てる 1 つの方法は、Initialize Array を使用して目的のサイズの u8 配列を作成し、次に Byte Array To String を使用してそれを文字列に変換することです。
渡す文字列が、文字列の内容を保持するのに十分な大きさであることを確認し、文字列の長さを DLL に渡して、バッファーの大きさを認識できるようにしてください。デフォルトのパラメーターは空の文字列だと思います。VIの最初の推測が十分に大きくない場合、適切な文字列の長さを計算するには、DLLを2回呼び出す必要がある場合があります。
「文字列ハンドル」パラメータを使用して文字列をライブラリ関数呼び出しノードに渡し、必要に応じてDLLでLabVIEW関数を使用して文字列のサイズを変更します。これには、DLL が LabVIEW とインターフェイスするように特別に設計されている必要があり、LabVIEW で提供されるスタティック ライブラリにリンクする必要があります。
このメソッドのサンプルは、LabVIEW に として付属してい
examples/dll/hostname/hostname.vi
ます。
あなたの質問から、数値を Labview に返すことができる DLL が既にあると思います。DLL から文字列を返すために、次の C++ 関数を使用して DLL を作成しました。
void returnString(char myString[])
{
const char *aString = "test string";
memcpy(myString, aString, 12);
}
次に、Labview で Call Library Function ノードを使用し、次のように構成します。
ライブラリ名またはパス: c:\path\to\my\custom.dll 関数名: returnString 呼び出し規約: C パラメーター: パラメータ: 戻り型 タイプ: ボイド パラメーター: arg1 タイプ: 文字列 文字列形式: C 文字列ポインタ 関数プロトタイプ: void returnString(CStr arg1);
ブロックダイアグラムの arg1 出力を文字列インジケータに接続して実行します。文字列 "test string" がフロント パネルに表示されます。
returnString 関数を次のように CStr 型にしようとしました
CStr returnString()
{ ...
}
しかし、DLL プロジェクトのコンパイル時にビルド エラーが発生しました。
アップデート@bk1e コメントのおかげで、文字列用に Labview でスペースを事前に割り当てることを忘れないでください。