2008-10-16 11 views
5

Ich versuche, eine Drittanbieter-DLL zu verwenden, die einen Int ** als einen der Parameter der Methode will. Er beschreibt den Parameter als die Adresse des Zeigers, der auf die Speicherzuweisung zeigt.DLLImport Int ** - Wie man das macht, wenn es getan werden kann

Entschuldigung für irgendeine Verwirrung. Der Parameter ist zwei-Wege, denke ich. Die DLL dient dazu, mit einer FPGA-Platine zu sprechen, und die Methode richtet die DMA-Übertragung zwischen dem Host-PC und der PCI-Platine ein.

Antwort

7

Verwenden Sie eine By-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

Da es Informationen weitergibt, ist es besser ref – JaredPar

+0

Wie konvertiere ich ein int [] in das IntPtr? –

+0

Die Verwendung des ref IntPtr scheint zu kompilieren und zu laufen. Ich muss noch etwas weiter gehen, bis ich weiß, dass es komplett funktioniert. –

1

Sie müssen die Marshalklasse verwenden oder in diesem Fall unsicher werden.

Es könnte auch nur ein Zeiger auf ein Array sein, so ein ref int[] list könnte funktionieren.

+0

Das ist etwas, was ich im Hinterkopf behalten werde, falls der andere Weg nicht funktioniert. –

+0

Wenn Sie Daten an die Funktion übergeben, ist dies möglicherweise am einfachsten. – leppie

0

Ein Int ** wäre und Array von IntPtr, von Ihrer Beschreibung denke ich, dass Sie vielleicht mit C++/CLI, um Sie mit den Konvertierungen zB von einem nicht verwalteten int ** zu einem verwalteten Array ^>^helfen möchten