2012-04-10 5 views
5

tengo esto en mi DLL creada en C++matriz de Manejo regresó de C++ DLL de C#

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

Y así es como estoy tratando de manejar código en 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??? 
     } 


    } 

Ayuda en trámite promover.

+0

¿Cuál es exactamente tu pregunta? –

+0

Quiero imprimir el returend de matriz desde código C++ en C# – pushE

Respuesta

-2

Trate de usar no vaciar StringBuilder como el valor de retorno.

1

La respuesta sería

string stra = Marshal.PtrToStringAnsi(a); 

Pero también tienen el problema de que la DLL devuelve la basura por su código como char * es una cadena estilo local c. estaría bien si desea devolver algo como:

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

Quiero pasar matriz de cadenas no una sola cadena – pushE

+0

Ok. Lo entendí mal. Hope ayuda de todos modos. – ervinbosenbacher

3

No hay manera de manejar este tipo de matrices. char a[2] se asigna en la pila en su función de C++ y se destruye tan pronto como regrese de ella. Debería pasar una matriz desde C# y llenarla con el código C++ o asignar una matriz en el montón y proporcionar algunos medios para liberarla.

Cuando lo tenga correcto, el manejo dependerá de cómo devuelva los datos del código C++. Si todavía es IntPtr, puede usar los métodos Marshal.ReadByte para leer caracteres de la memoria y usar métodos de codificación para convertir esos bytes en cadenas si es necesario.

 

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

que tiene una solución de la siguiente manera ::

NUESTRO código C++ es el siguiente

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

y C# es la siguiente

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

El único problema ahora enfrentado es que ¿cómo podemos saber el tamaño de la matriz para que en esta instrucción cadena [] s = nueva cadena [100]; no necesitamos desperdiciar nuestra memoria.