2012-04-10 11 views
5

にDLL C++から返された私は、この私のC++取り扱いアレイは、C#

extern "C" __declspec(dllexport) 
    char* __stdcall hh() 
{ 
    char a[2]; 
    a[0]='a'; 
     a[1]='b'; 
    return(a); 
} 

をで作成したDLLとで、これは私がC#での手続において

[DllImport(@"mydll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]  
     public static extern IntPtr hh(); 
     static void Main(string[] args) 
     { 
      IntPtr a = hh(); 
      //How to proceed here??? 
     } 


    } 

ヘルプコードを処理しようとしている方法ですさらに。

+0

あなたの質問は何ですか? –

+0

配列のreturendをC++のコードから出力したい# – pushE

答えて

-2

戻り値として空のStringBuilderを使用しないでください。

1

答えは

string stra = Marshal.PtrToStringAnsi(a); 

だろう。しかし、あなたはまた、char型の*は、ローカルのCスタイルの文字列であるとして、DLLは、コードごとにゴミを返すという問題があります。そのようなアレイを処理する方法はありません

const char* str = "Hello from DLL."; 
+0

単一の文字列ではなく文字列の配列を渡したい – pushE

+0

Ok。そのビットを誤解しました。とにかく希望は助けます。 – ervinbosenbacher

3

:あなたが何かを返すかどう はOKだろう。 char a[2]は、C++関数のスタックに割り当てられ、その関数から戻るとすぐに破棄されます。 C#から配列を渡してC++コードに記入するか、ヒープに配列を割り当てて、それを解放する手段を提供する必要があります。

正しい場合は、C++コードからデータを返す方法によって処理が異なります。それでもIntPtrの場合は、Marshal.ReadByteメソッドを使用してメモリから文字を読み込み、必要に応じてEncodingメソッドを使用してこれらのバイトを文字列に変換することができます。

 

const int bufferSize = 2; // suppose it's some well-known value. 
IntPtr p = ...; // get this pointer somehow. 
for (var i = 0; i != bufferSize; ++i) 
{ 
    var b = Marshal.ReadByte(p, i); 
    Console.WriteLine(b); 
} 
 
2

次のように私は解決策を持って::

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

を次のように

OUR 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]; 
      do 
      { 
       s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(a,4*j)); 
       j++; 
      } 
      while(s[j-1] != null); 
     } 

唯一の問題を次のようにC#が行きます配列のサイズを知るにはどうすればいいのですか? このようにこの文では 文字列[] s =新しい文字列[100]; 私たちはメモリを浪費する必要はありません。