C#调用C++的一个方法,声明有关问题

C#调用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楼顶起。
------解决方案--------------------
引用:
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);

+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;