2008-10-16 20 views
5

Próbuję użyć trzeciej biblioteki DLL, która chce int ** jako jeden z parametrów metody. Opisuje parametr jako adres wskaźnika, który wskaże alokację pamięci.DLLImport Int ** - jak to zrobić, jeśli można to zrobić

Przepraszamy za jakiekolwiek zamieszanie. Parametr jest dwukierunkowy, myślę. Biblioteka DLL służy do rozmowy z płytą FPGA, a metoda polega na skonfigurowaniu transferu DMA między komputerem głównym a kartą PCI.

Odpowiedz

7

Użyj 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

Od czasu przekazywania informacji, lepiej jest wpisać nr ref. – JaredPar

+0

Jak przekonwertować int [] na IntPtr? –

+0

Korzystanie z ref IntPtr wydaje się kompilować i działać. Mam jeszcze trochę czasu, zanim się zorientuję, że działa całkowicie. –

1

Będziesz musiał skorzystać z klasy Marshal lub pójść niebezpiecznie w tym przypadku.

Może to być po prostu wskaźnik do tablicy, więc ref int[] list może działać.

+0

Jest to coś, co będę pamiętał na wypadek, gdyby inny sposób nie zadziałał. –

+0

Jeśli przekazujesz dane do funkcji, może to być najłatwiejsze. – leppie

0

Int ** będzie tablicą IntPtr, z Twojego opisu Myślę, że warto zajrzeć do C++/CLI, aby pomóc Ci z konwersjami, np. Z niezarządzanego int ** do zarządzanej tablicy ^>^