2015-10-12 9 views
5

Đây là mã C#.Vượt qua char ** theo tham chiếu từ C# đến không được quản lý C++

namespace CameraTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] lst = new string[10]; 
      for (int i = 0; i < 10; i++) 
      { 
       lst[i] = new string(' ', 33); 
      } 
      bool sync = true; 
      bool ret = CameraCalls.CAM_EnumCameraEx(sync, lst, 10, 33); 

     } 
    } 

    public static class CameraCalls 
    { 
     [DllImport("CamDriver64.dll")] 
     public static extern bool CAM_EnumCameraEx(bool sync, 
                [MarshalAs(UnmanagedType.LPArray)] 
                string[] lst, 
                long maxCam, 
                long maxChar); 
    } 
} 

Phương pháp không được quản lý này.

BOOL WINAPI CAM_EnumCameraEx(BOOL bSynchronized, char **ppCameraList, long lMaxCamera, long lMaxCharacter); 

Phương pháp ghi vào chuỗi được truyền. Có cách nào để gọi phương thức này từ C# và có mã không được quản lý có thể ghi vào mảng chuỗi không?

+3

[marshaling loại khác nhau của Mảng] (https://msdn.microsoft.com/en-us/library/hk9wyw21 (v = vs.110) .aspx) –

+0

Tài liệu đó có câu trả lời tất cả những gì đã có để làm là sử dụng In, Out –

Trả lời

1

Điều này làm việc cảm ơn Remus Rusanu rằng liên kết đã có câu trả lời. Tất cả những gì tôi phải làm là trang trí với [In, Out] trên tham số lst.

namespace CameraTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int maxCam = 10, 
       maxChar = 33; 

      var lst = (new object[maxCam]).Select(o => new string(' ', maxChar)).ToArray(); 
      bool sync = true; 
      bool ret = CameraCalls.CAM_EnumCameraEx(sync, lst, maxCam, maxChar); 

     } 
    } 

    public static class CameraCalls 
    { 
     [DllImport("CamDriver64.dll")] 
     public static extern bool CAM_EnumCameraEx(bool sync, 
                [In, Out] 
                string[] lst, 
                long maxCam, 
                long maxChar); 
    } 
} 
+0

Chỉ cần thử nghiệm câu trả lời của tôi với 'StringBuilder []' và có lỗi mất cân đối ngăn xếp, vì vậy tôi nghĩ @HansPassant đã đúng. Vẫn vui vì cách tạo một mảng mới của bất kỳ đối tượng nào đang lan rộng :) –

+1

Điều này không đúng. –

+0

Có gì không đúng? –

Các vấn đề liên quan