如何导入void ** c++ API到c#
本文关键字:c++ API void 何导入 导入 | 更新日期: 2023-09-27 18:19:04
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#正确吗?如何在c#中声明void** ?
这取决于dcam_attachbuffer的功能。
如果使用buffer,定义方法
[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[]中的指针
你可以直接在c#的不安全块中声明指针。
还有IntPtr
或者您可以编写一些c++/CLI将两者粘合在一起
参数是IntPtr[](没有ref)。删除不必要的属性后:
[DllImport("dcamapi.dll")]
public static extern bool dcam_attachbuffer(IntPtr handleCamera,
IntPtr[] buf, int bufsize);
正确初始化数组也可能是一个挑战,从问题中可以看出需要什么。