4

LabVIEWのライブラリ関数呼び出しノードを使用してDLL関数にアクセスし、この関数がVIに表示される文字列を返すようにしたいと考えています。どうすればこれを行うことができますか?私は自分の DLL から数値を返すことに非常に満足していますが、文字列を返す方法の例を見つけるのに本当に苦労しています。

4

2 に答える 2

3

ライブラリ関数呼び出しノードから文字列を返すには、少なくともいくつかの方法があります。

  1. DLL 関数から C 文字列ポインターを返し、「C 文字列ポインター」の戻り型を持つようにライブラリ関数呼び出しノードを構成します。返される文字列は、関数が返された後に有効である必要があるため、スタックに割り当てられた文字列へのポインターにすることはできません。次のいずれかである必要があります: ヒープに割り当てられた、静的に割り当てられた、定数文字列リテラルなど。

    examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.viLabVIEWディレクトリではこのアプローチを採用しているようです。

  2. VIに文字列を割り当て、Azimが提案したように「C文字列ポインタ」パラメータを使用してライブラリ関数呼び出しノードに渡し、その内容をDLLで上書きします。文字列を割り当てる 1 つの方法は、Initialize Array を使用して目的のサイズの u8 配列を作成し、次に Byte Array To String を使用してそれを文字列に変換することです。

    渡す文字列が、文字列の内容を保持するのに十分な大きさであることを確認し、文字列の長さを DLL に渡して、バッファーの大きさを認識できるようにしてください。デフォルトのパラメーターは空の文字列だと思います。VIの最初の推測が十分に大きくない場合、適切な文字列の長さを計算するには、DLLを2回呼び出す必要がある場合があります。

  3. 「文字列ハンドル」パラメータを使用して文字列をライブラリ関数呼び出しノードに渡し、必要に応じてDLLでLabVIEW関数を使用して文字列のサイズを変更します。これには、DLL が LabVIEW とインターフェイスするように特別に設計されている必要があり、LabVIEW で提供されるスタティック ライブラリにリンクする必要があります。

    このメソッドのサンプルは、LabVIEW に として付属していexamples/dll/hostname/hostname.viます。

于 2008-11-07T05:30:49.383 に答える
2

あなたの質問から、数値を 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 でスペースを事前に割り当てることを忘れないでください。

于 2008-11-06T17:50:34.053 に答える