2015-10-12 25 views
5

Questo è il codice C#.Pass char ** per riferimento da C# a C++ non gestito

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

Il metodo non gestito è questo.

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

Il metodo scrive sull'array di stringhe passato. C'è un modo per chiamare questo metodo da C# e far sì che il codice non gestito sia in grado di scrivere sull'array di stringhe?

+3

[Marshalling diversi tipi di array] (https://msdn.microsoft.com/en-us/library/hk9wyw21 (v = vs.110) aspx) –

+0

Tale documento aveva la risposta tutto quello che avevo per fare era usare In, Out –

risposta

1

Questo ha funzionato grazie a Remus Rusanu che il collegamento ha avuto la risposta. Tutto ciò che avevo da fare era decorare con [In, Out] sul primo parametro.

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

Ho appena testato la mia risposta con 'StringBuilder []' e ho ottenuto errore di sbilanciamento dello stack, quindi penso che @HansPassant avesse ragione. Ancora felice il mio modo di creare una nuova schiera di oggetti che si stanno già diffondendo :) –

+1

Questo non è giusto. –

+0

Cosa non va? –