2016-11-03 56 views
0

我想從.NET調用DLL(使用LabView創建)。我已經成功了大部分方法,但需要一個字符串數組作爲輸入。在.NET中使用LStrHandleArray

的Labview創建DLL文件,但函數原型不使用字符指針,因爲我所期望的,而是一個LStrHandleArray時,理應採用C調用約定:

void SetOutputUnits(LStrHandleArray *OutputUnits) 

有誰知道我需要什麼參考包括要能夠從.NET內使用LStrHandleArray?

使用Google搜索LStrHandleArray只會得到19個結果,其中大多數是其他論壇上未解答的問題。我添加了每個可以考慮的National Instruments參考資料,但是我沒有看到LStrHandleArray,並且在線上也找不到任何文檔。

回答

0

類型的定義如下:

/** @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; 

注意的是,使用的1是C技術,使數組類型被分配,而不是在一個單獨的指針平坦的內聯。無論數組的長度或字符串的長度如何,都使用相同的聲明。你分配足夠的內存容納數組/字符串的全部大小......索引故意超出了聲明的分配大小。這在託管語言中是聞所未聞的,但這是編譯器使用的底層結構聲明。

要從.NET代碼調用,您需要創建一個包裝器DLL,它將數據展開爲一個字符串或其他可編組數據結構,然後在C++代碼中展開\ unfloveloten \ construct。數組句柄本身和內部字符串句柄都必須從extcode.h頭文件中分配DSNewHandle()或DSNewHClr(),以便它們位於LabVIEW可以處理的內存空間中。

This example顯示從另一個C DLL調用DLL,但它有其他有用的討論。

PS:LabVIEW是否使用C調用約定。這是指堆棧上參數的順序以及數據結構都可以用PODs (plain old C data types)定義的事實。它並不意味着接口中使用的數據結構。