2012-04-11 99 views
0

其實我正在使用C#中的C++的dll如下如何知道在C傳遞一個數組的大小++的dll到C#

我的C++代碼

extern "C" __declspec(dllexport) 
    char** __stdcall hh() 
{ 
static char* myArray[3] = {"A1", "BB2", "CC3",}; 
    return myArray; 
} 

我的C#代碼

[DllImport(@"ourdll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]  
     public static extern IntPtr hh(); 
     static void Main(string[] args) 
     { 
      IntPtr a = hh(); 
      int j = 0; 
      string[] s=new string[100]; //I want this to be dynamic 
      do 
      { 
       s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(a,4*j)); 
       j++; 
      } 
      while(s[j-1] != null); 
     } 

我無法獲得由hh()返回的數組的大小;我怎樣才能獲得數組的大小,以便我的代碼行

串[] S =新的字符串[100]; 更改 串[] S =新的字符串[陣列的實際長度]。

+0

可能的重複[如何從C中的指針獲取數組的大小?](http://stackoverflow.com/questions/232691/how-can-i-get-the-size-of-一個陣列-從-A-指針在-C) – 2012-04-11 07:09:39

回答

3

你要麼不得不返回數組的大小,以及(可能是通過引用變量),或者你可以添加一個NULL結束到列表中。如果您使用NULL終止符,則可以遍歷該數組,直到找到NULL以確定大小。

+0

,我通過編組使用在訪問所述陣列的元件,但沒有任何辦法知道大小的數組返回。 – pushE 2012-04-11 05:18:18

+4

該函數返回一個char **。這沒有大小的概念,它會自動計算出來。它只是一個指向char的指針。它發生在一個指針數組是指向但並沒有什麼告訴編譯器即是如此。 – drewag 2012-04-11 05:20:47

1

,如果你想找到的PInvoke數組的長度,你可以使用Marshal.SizeOf(object)方法

MSDN Link

這對我的作品的結構

0

這種類型的數組被稱爲C-風格數組和.NET框架的編組服務由於其原始性質而對它的支持有限,因此您應該考慮通過使用引用參數來返回數組的長度(作爲示例,這在Win32 API編程中很常見) 。 還記得C樣式數組的長度不是在所有的動態,並且必須是常量表達式所以HH()函數將不返回任何動態長度值,而只是一個硬編碼之一。

相關問題