2008-10-16 17 views
5

Estoy tratando de usar una DLL de terceros que quiere un int ** como uno de los parámetros del método. Describe el parámetro como la dirección del puntero que señalará la asignación de memoria.DLLImport Int ** - Cómo hacer esto si se puede hacer

Disculpa cualquier confusión. El parámetro es bidireccional, creo. La DLL es para hablar con una placa FPGA y el método está configurando la transferencia de DMA entre la PC host y la placa PCI.

Respuesta

7

Utilice un ref. System.IntPtr.

[DllImport("thirdparty.dll")] 
static extern long ThirdPartyFunction(ref IntPtr arg); 

long f(int[] array) 
    { long retval = 0; 
    int size = Marshal.SizeOf(typeof(int)); 
    var ptr = IntPtr.Zero; 

    try 
    { ptr = Marshal.AllocHGlobal(size * array.Length); 

     for (int i= 0; i < array.Length; ++i) 
     { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size)); 
      Marshal.StructureToPtr(array, tmpPtr, false); 
     } 

     retval = ThirdPartyFunction(ref ptr); 
    } 
    finally 
    { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr); 
    } 

    return retval; 
    } 
+0

Dado que está pasando información, es preferible ref – JaredPar

+0

¿Cómo convierto un int [] a IntPtr? –

+0

Uso de la referencia IntPtr parece estar compilando y ejecutándose. Tengo un poco más por recorrer hasta que sepa que está funcionando completamente. –

1

Tendrás que hacer uso de la clase Marshal o no ser seguro en este caso.

También podría ser simplemente un puntero a una matriz, por lo que un ref int[] list podría funcionar.

+0

Esto es algo que tendré en cuenta en caso de que el otro método no funcione. –

+0

Si está pasando datos a la función, esta podría ser la más fácil. – leppie

0

Un int ** sería y una matriz de IntPtr, de su descripción, creo que es posible que desee examinar el uso de C++/CLI para ayudarle con las conversiones, por ejemplo, de un int ** no administrado a una matriz administrada ^>^

Cuestiones relacionadas