5

C ++で作成されたdllにこれがあります

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

そして、これは私が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???
        }


    }

さらに進めるのに役立ちます。

4

4 に答える 4

3

そのような配列を処理する方法はありません。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);
}

于 2012-04-10T09:57:15.983 に答える
2

私は次のように解決策を得ました::

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

現在直面している唯一の問題は、このステートメント string[] s=new string[100];で配列のサイズをどのように知ることができるかということです。 記憶を無駄にする必要はありません。

于 2012-04-11T05:04:52.510 に答える
1

答えは

 string stra = Marshal.PtrToStringAnsi(a);

しかし、char* はローカルの C スタイルの文字列であるため、dll がコードごとにガベージを返すという問題もあります。次のようなものを返せば問題ありません。

 const char* str = "Hello from DLL.";
于 2012-04-10T09:14:04.420 に答える
-2

空でない StringBuilder を戻り値として使用するようにしてください。

于 2012-04-10T08:41:19.937 に答える