2016-11-03 20 views
0

.NETから(LabViewで作成された)DLLを呼び出そうとしています。ほとんどのメソッドで成功しましたが、文字列配列を入力として必要とします。.NETでLStrHandleArrayを使用する

DLLを作成するときに、LabVIEWがおそらくCの呼び出し規約を使用しますが、関数のプロトタイプは、私が期待するようchar型のポインタを使用するのではなくLStrHandleArrayしません:

void SetOutputUnits(LStrHandleArray *OutputUnits) 

誰もが、私はあることを含めるために必要なものを参照知っています.NET内からLStrHandleArrayを使用することができますか?

グーグルLStrHandleArrayは19の結果しか得ていませんが、そのほとんどは他のフォーラムでは未解決の質問です。私が考えることができるすべてのナショナルインスツルメンツのリファレンスを追加しましたが、LStrHandleArrayが表示されず、オンラインでドキュメントを見つけることができません。

答えて

0

次のように型の定義は次のとおり1の使用は、アレイタイプはフラットインラインの代わりに別のポインタに割り当てられるするためにC技術であること

/** @brief Long Pascal-style string types. */ 
typedef struct { 
    int32 cnt;  /* number of bytes that follow */ 
    uChar str[1];  /* cnt bytes */ 
} LStr, *LStrPtr, **LStrHandle; 
typedef struct _LStrArray { 
    int32 nElts; 
    LStrHandle str[1]; 
} LStrArray, **LStrArrayHandle; 

注意。配列の長さや文字列の長さに関係なく、同じ宣言が使用されます。配列/文字列のフルサイズに対応する十分なメモリを割り当てます...インデックスは、意図的に宣言された割り当てサイズを超えます。管理された言語では何も聞こえませんが、これはコンパイラが使用する低レベルの構造宣言です。

.NETコードから呼び出すには、文字列またはその他の整列可能なデータ構造としてマーシャリングし、次にC++コードで\構造を整形解除するデータのフラット形式をとるラッパーDLLを作成する必要があります。配列ハンドル自体と内部文字列ハンドルの両方を、extcode.hヘッダファイルからDSNewHandle()またはDSNewHClr()で割り当てて、LabVIEWが操作できるメモリ空間に収まるようにする必要があります。

This exampleは、別のC DLLからDLLを呼び出すことを示していますが、他の参考になる議論があります。

PS:LabVIEWはC呼び出し規約を使用しています。これは、スタック上のパラメータの順序と、データ構造がすべてPODs (plain old C data types)で定義可能であるという事実を指します。インタフェースで使用されているデータ構造について何も意味するものではありません。

関連する問題