Как импортировать void ** C ++ API в C #? - PullRequest
3 голосов
/ 31 декабря 2011

В c ++ API декларация является

BOOL DCAMAPI dcam_attachbuffer          ( HDCAM h, void** top, _DWORD size );

аргументы: void ** top --- массив указателей на буфер _DWORD size-- размер верхнего параметра в байтах

В c # вот как я импортирую файл dll:

[DllImport("dcamapi.dll", EntryPoint = "dcam_attachbuffer",
          CallingConvention = CallingConvention.StdCall,
          CharSet = CharSet.Ansi, BestFitMapping = false,
          ThrowOnUnmappableChar = true)]
        [return: MarshalAsAttribute(UnmanagedType.Bool)]

   public static extern bool dcam_attachbuffer(IntPtr handleCamera,
 [MarshalAsAttribute(UnmanagedType.LPArray)]ref Int32[] buf, 
[MarshalAsAttribute(UnmanagedType.U4)] Int32 bufsize);

Мой вопрос: правильно ли я преобразовываю тип из c ++ в c #? и как мне объявить void ** в c #? пожалуйста, помогите мне.

Ответы [ 3 ]

2 голосов
/ 31 декабря 2011

Аргументом является IntPtr [] (без ссылки). С удаленными ненужными атрибутами:

[DllImport("dcamapi.dll")]
public static extern bool dcam_attachbuffer(IntPtr handleCamera, 
    IntPtr[] buf, int bufsize);

Корректная инициализация массива также может быть проблемой, из вопроса, что требуется, совершенно неясно.

2 голосов
/ 31 декабря 2011

Это зависит от того, какую функцию выполняет dcam_attachbuffer.

Если он принимает буфер, определите метод

[DllImport("dcamapi.dll", EntryPoint = "dcam_attachbuffer"]
public static extern bool dcam_attachbuffer(
    IntPtr handleCamera,
    IntPtr ptrsBuf, 
    Int32 bufSize);

и указатель передачи, полученный ранее.

Если функция получаетуказатель указателей, определите метод

[DllImport("dcamapi.dll", EntryPoint = "dcam_attachbuffer"]
public static extern bool dcam_attachbuffer(
    IntPtr handleCamera,
    ref IntPtr ptrsBuf, 
    Int32 bufSize);

и используйте

System.Runtime.InteropServices.Marshal.Copy(
    IntPtr source,
    IntPtr[] destination,
    int startIndex,
    int length
)

для копирования указателей в IntPtr []

2 голосов
/ 31 декабря 2011
...