C#调用C++的一个方法,声明有关问题
C#调用C++的一个方法,声明问题
C++的方法原型是这样的,对于最后两个参数,可视不知道如何C#中声明;
------解决方案--------------------
.net互操作最麻烦,代码看上去也会复杂。如果能使用vc互操作封装一个clr的dll供调用最好。
参考:http://msdn.microsoft.com/zh-cn/library/ektebyzx.aspx
------解决方案--------------------
delegate void StreamCallback(int handle, int iStreamType, IntPtr data, int size, IntPtr pUser);
extern int Plat_VSS_PlayVideo(int iUserHandle, int iCameraID, long hWnd, StreamCallback fStreamCallback, IntPtr pUser);
------解决方案--------------------
long -> IntPtr
------解决方案--------------------
3楼顶起。
------解决方案--------------------
+1
函数指针在C#里用委托,使用的时候
------解决方案--------------------
C++的方法原型是这样的,对于最后两个参数,可视不知道如何C#中声明;
/*******************************************************************************
* 参数说明:
* iUserHandle Plat_LoginCMS返回的句柄
* iCameraID 监控点ID
* hWnd 播放窗口句柄,如果为空,则不播放
* fStreamCallback void(__stdcall *fStreamCallback)(int handle, int iStreamType, const char* data,int size,void * pUser) 视频码流接收回调函数指针,如果回调函数为NULL则返回失败
* pUser void* 用户数据
* 其他参数说明
* handle StartVideoStream返回的句柄
* iStreamType 文件类型(码流头或者码流数据)
* data 接收视频码流数据缓冲区指针
* size 接收视频码流数据字节数
* pUser 用户数据
* 返回值: 调用成功返回播放句柄, -1 调用失败,通过Plat_GetLastError()查看错误码
*******************************************************************************/
int Plat_VSS_PlayVideo(int iUserHandle,
int iCameraID,
long hWnd,
void(__stdcall *fStreamCallback)(int handle,int iStreamType,const char* data,int size,void* pUser) = NULL,
void* pUser = NULL);
------解决方案--------------------
.net互操作最麻烦,代码看上去也会复杂。如果能使用vc互操作封装一个clr的dll供调用最好。
参考:http://msdn.microsoft.com/zh-cn/library/ektebyzx.aspx
------解决方案--------------------
delegate void StreamCallback(int handle, int iStreamType, IntPtr data, int size, IntPtr pUser);
extern int Plat_VSS_PlayVideo(int iUserHandle, int iCameraID, long hWnd, StreamCallback fStreamCallback, IntPtr pUser);
------解决方案--------------------
long -> IntPtr
------解决方案--------------------
3楼顶起。
------解决方案--------------------
+1
函数指针在C#里用委托,使用的时候
IntPtr P = new IntPtr();
Marshal.StructureToPtr(new StreamCallback(Callback).Target, P, true);
int n = Plat_VSS_PlayVideo(1, 2,3,P,4);
void Callback(int handle, int iStreamType, IntPtr data, int size, IntPtr pUser)
{
// ...
}
------解决方案--------------------
class Program
{
delegate void StreamCallbackHandler(int handle, int iStreamType, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] data, int size, IntPtr pUser);
[DllImport(dllPath)]
private static extern int Plat_VSS_PlayVideo(int iUserHandle, int iCameraID, int hWnd, StreamCallbackHandler fStreamCallback, IntPtr pUser);
class PlayVideoData
{
public int intValue;
public string stringValue;
}
private static void TEST0_Plat_VSS_PlayVideo()
{
var pvc = GCHandle.Alloc(new PlayVideoData
{
intValue = 1,
stringValue = "MyString",
});
Plat_VSS_PlayVideo(0, 1, 2, (int handle, int iStreamType, byte[] data, int size, IntPtr pUser) =>
{
var pvd = (PlayVideoData)GCHandle.FromIntPtr(pUser).Target;