如何将void ** C ++ API导入C#?

时间:2011-12-31 07:32:03

标签: c# pinvoke dllimport

在c ++ API声明中

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

参数: void ** top ---是指向缓冲区的指针数组 _DWORD size--是top参数的大小,以字节为单位

在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#?如何在c#中声明void **?请帮帮我。

3 个答案:

答案 0 :(得分:2)

You can declare pointers directly in C# in unsafe blocks.

There's also IntPtr.

或者您可以编写一些C ++ / CLI来将两者粘合在一起。

答案 1 :(得分:2)

参数是IntPtr [](没有引用)。删除了不必要的属性:

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

正确地初始化阵列也是一个挑战,从问题的要求来看还不清楚。

答案 2 :(得分:2)

取决于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 []

中的指针