2012-04-10 33 views
5

Tôi có điều này trong dll của tôi tạo ra trong C++Xử lý mảng trở về từ C++ dll C#

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

Và đây là cách tôi đang cố gắng để xử lý mã trong 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??? 
     } 


    } 

Trợ giúp trong tố tụng thêm nữa.

+0

Câu hỏi của bạn chính xác là gì? –

+0

Tôi muốn in mảng returend từ mã C++ trong C# – pushE

Trả lời

-2

Cố gắng sử dụng không trống StringBuilder làm giá trị trả lại.

1

Câu trả lời sẽ là

string stra = Marshal.PtrToStringAnsi(a); 

Nhưng bạn cũng có vấn đề mà các dll trả rác mỗi mã của bạn như char * là một chuỗi c phong cách địa phương. Sẽ không sao nếu bạn trả lại một cái gì đó như:

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

Tôi muốn chuyển mảng chuỗi không phải là một chuỗi đơn – pushE

+0

Ok. Hiểu sai chút đó. Hy vọng sẽ giúp anyway. – ervinbosenbacher

3

Không có cách nào xử lý các mảng như vậy. char a[2] được cấp phát trên ngăn xếp trong hàm C++ của bạn và bị hủy ngay sau khi bạn quay trở lại. Bạn nên chuyển một mảng từ C# và điền nó vào mã C++ hoặc phân bổ mảng trong heap và cung cấp một số phương tiện để giải phóng nó.

Khi bạn đã khắc phục, việc xử lý sẽ tùy thuộc vào cách bạn trả về dữ liệu từ mã C++. Nếu nó vẫn là IntPtr, bạn có thể sử dụng các phương thức Marshal.ReadByte để đọc các ký tự từ bộ nhớ và sử dụng các phương thức mã hóa để chuyển đổi các byte đó thành chuỗi nếu cần thiết.

 

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

tôi nhận được một giải pháp như sau ::

C++ CHÚNG TÔI đi như sau

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

Và C# đi như sau

[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); 
     } 

Vấn đề duy nhất hiện nay phải đối mặt là làm thế nào chúng ta có thể biết kích thước của mảng sao cho trong tuyên bố này chuỗi [] s = chuỗi mới [100]; chúng ta không cần lãng phí bộ nhớ của mình.