在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 **?请帮帮我。
答案 0 :(得分:2)
You can declare pointers directly in C# in unsafe blocks.
或者您可以编写一些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 []
中的指针