当前位置:编程学习 > C#/ASP.NET >>

C#调用C++动态库问题。。

C++中的函数接口
long P2PAPI_SendMessage(long nHandle, char *msg, int len)


下面是这个接口用C++调用的例子。参数在注释中给出了
C++ 中的函数
    // TODO: 在此添加控件通知处理程序代码
    int nCmd = CMD_PTZ_UP;//#define CMD_PTZ_UP 0
//#define MSG_TYPE_DECODER_CONTROL 0x3
    P2PAPI_SendMessage(m_hP2PHandle, MSG_TYPE_DECODER_CONTROL, (char*)&nCmd, sizeof(int));
下面是这个函数的接口

我的C#调用
        [DllImport("P2PAPI.dll", EntryPoint = "P2PAPI_SendMessage", CallingConvention = CallingConvention.Cdecl)]
        static extern int P2PAPI_SendMessage(int handle, int type,string msg, int len);
这样子使用对不对,我到现在都没调用成功 c++ c# 库 --------------------编程问答-------------------- char *用StringBuilder --------------------编程问答-------------------- 接口 和 调用的例子 参数列表都对不上了 --------------------编程问答-------------------- int len和sizeof(int)不是一回事吧,sizeof(int)是取int类型长度,对应32位机器就是4,而你声明的len是个变量吧,不一定是sizeof(int)长度吧 --------------------编程问答-------------------- 他提供的API文档是这样写的。我也不知道! --------------------编程问答-------------------- 这种情况char*写成byte[]会容易一些:
static extern int P2PAPI_SendMessage(int handle, int type, byte[] msg, int len);

调用:
int nCmd = 0; // CMD_PTZ_UP
byte[] cmdBytes = BitConverter.GetBytes(nCmd);
P2PAPI_SendMessage(m_hP2PHandle, MSG_TYPE_DECODER_CONTROL, cmdBytes, cmdBytes.Length);
--------------------编程问答-------------------- 参数类型不一致啊 --------------------编程问答-------------------- 将string转成byte[],然后用fixed固定住,传过去 --------------------编程问答--------------------
引用 5 楼 gomoku 的回复:
这种情况char*写成byte[]会容易一些:
static extern int P2PAPI_SendMessage(int handle, int type, byte[] msg, int len);

调用:
int nCmd = 0; // CMD_PTZ_UP
byte[] cmdBytes = BitConverter.GetBytes(nCmd);
P2PAPI_SendMessage(m_hP2PHandle, MSG_TYPE_DECODER_CONTROL, cmdBytes, cmdBytes.Length);
再问一下 
long P2PAPI_SetAVDataCallBack(AVDataCallback AVCallback, void
*pParam)
描述:设置音视频数据回调
参数:
AVCallback:【IN】
回调函数定义如下:
typedef void (*AVDataCallback)(long nHandle, int bVideo, char *pData, int len,
void *pParam)这个回调函数的参数要怎么转换啊?
我这样的不行 delegate void AVDataCallBack(int handel, int nVideo,byte[] Data, int Len, IntPtr Param); --------------------编程问答--------------------
引用 8 楼 u012553424 的回复:
我这样的不行 delegate void AVDataCallBack(int handel, int nVideo,byte[] Data, int Len, IntPtr Param);


byte[]可以用来传入缓冲区指针,但不可以直接用来从非托管接受数据。原因是char*只是一个指针,不包含长度信息。而byte[]本身要有长度信息,char*却没有办法提供。

解决方法是用IntPtr。从IntPtr读数据麻烦一点,要用Marshal类或unsafe代码。
void AVDataCallBack(int handel, int nVideo, IntPtr Data, int Len, IntPtr Param);
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,