C# 调用 C++的DLL 尝试读取或写入受保护的内存

sukney 2011-07-16 12:50:33
C++ 原形
DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *instream, int istream_size, unsigned char *outstream); //解码,其中index为解码器的索引号,istream是编码数据,istream_size编码数据的大小,ostream为解码后的数据
DLL_EXPORT int WAPA_IPC_SetDataCallBack(DataCallBack fData); //设置视频回调函数
typedef BOOL (CALLBACK *DataCallBack)(int index, int type, BYTE* pData, int len, int param1, int param2);

C#代码
//解码,其中index为解码器的索引号,istream是编码数据,istream_size编码数据的大小,ostream为解码后的数据
[DllImport("SDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_Dec(int index, [In, MarshalAs(UnmanagedType.LPStr)]StringBuilder instream, int istream_size, [Out, MarshalAs(UnmanagedType.LPStr)]StringBuilder outstream);
//视频回调函数,index为摄像机索引,type为帧类型,pData为指向长度为len的帧数据的指针,bMove为TRUE表示这一帧的图像有移动,param1、param2为图像宽高

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate bool DataCallBack(int index, int type, [In, MarshalAs(UnmanagedType.LPStr)]StringBuilder pData, int len, int param1, int param2);
调用

int i = DvrClinet.DvrInit(TVFORMAT.PAL);
int m; StringBuilder _buildera;
m = DvrClinet.DvrLogin("192.168.1.200", 0);
int y = DvrClinet.DvrInitDec(1920, 1080, 264, 0);
int n = DvrClinet.DvrGetCameraState(m);
_buildera = new StringBuilder(1920 * 1080 * 2);
DvrClinet.DvrSetDataCallBack(new DataCallBack(ShowDisplay));
public bool ShowDisplay(int index, int type, [In, MarshalAs(UnmanagedType.LPStr)]StringBuilder pData, int len, int param1, int param2)
{
byte[] ss = new byte[len];
byte[] aa = new byte[len];

IntPtr pImage = Marshal.AllocHGlobal(param1 * param2);

// pData = new StringBuilder(len);
DvrClinet.WAPA_IPC_Dec(m, pData, len, _buildera);//这里报错,尝试读取或写入受保护的内存

//_buildera.Remove(0, _buildera.Length);
//pData.Remove(0, _buildera.Length);

MessageBox.Show(pData.Length.ToString()
);

return true;
}



为什么 一调试就出现 尝试读取或写入受保护的内存的错误呢,请高手帮忙 要怎么改
...全文
332 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
很显然,定义为局部变量,数据就会很快被移动甚至被GC回收掉。
  • 打赏
  • 举报
回复
懒的去用c#调用c++代码。如果可能,应该删除了c++代码,重新做(直接调用win api)。或者我更愿意调用c代码,而不是那些小程序员写的所谓c++代码。

有两种情况经常需要考虑到:
1. 许多时候,你需要修改应用程序的属性,禁止通过vshost.exe来启动调试。因为vs的调试程序会让一些用到了驱动的c++程序垮掉。

2. 假设c++程序中(默认地)假设数据在内存里是不变的,并且它胡乱地用指针来勾着数据,那么你的c#程序就不能定义为类型或者方法的局部变量,一定要定义为static变量。
sukney 2011-07-16
  • 打赏
  • 举报
回复
C++ demo里的调用
#define HD_W 1920
#define HD_H 1080
BOOL CALLBACK Recvdata(int index, int mode, BYTE* data, int len, int w, int h)
{
if(StartDecCif[index] == 0 && mode == DATA_TYPE_HD_IFRAME){
StartDecCif[index] = 1;
}

if(StartDecCif[index]){
if(w == HD_W){
frameRate[index]++;
brData[index] += len;
sprintf(g_str[index], "FR = %d BR = %.02fKB/S", preFrame[index], preBr[index]);

WAPA_IPC_Dec(index, data, len, yuyv_buf_s[index]);
g_pRenderCif[index] -> Render(yuyv_buf_s[index], g_str[index]);

if(g_bPhoto == true){
WAPA_IPC_OnPhoto(index, yuyv_buf_s[index], false);
g_bPhoto = false;
}
}else{
frameRate[index + 1]++;
brData[index + 1] += len;
sprintf(g_str[index + 1], "FR = %d BR = %.02fKB/S", preFrame[index+ 1], preBr[index+ 1]);
WAPA_IPC_Dec(index+1, data, len, yuyv_buf_s[index]);
g_pRenderCif[index+1] -> Render(yuyv_buf_s[index], g_str[index + 1]);

if(g_sPhoto == true){
WAPA_IPC_OnPhoto(index, yuyv_buf_s[index], true);
g_sPhoto = false;
}
}
}

return TRUE;
}
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
for(int i = 0; i < CAMERA_NUM; i++){
preFrame[i] = frameRate[i];
preBr[i] = brData[i] / 1024 * 8;
frameRate[i] = 0;
brData[i] = 0;
}

}

void CPlayDlg::Init(int index)
{
GetWindowText(m_sIp, sizeof(m_sIp));
strcpy(m_sIp_store[index], m_sIp);
relution = 0;

GetDlgItem(IDC_STATIC_CIF1, &hWndCif[index]);
GetDlgItem(IDC_STATIC_CIF2, &hWndCif[index+ 1]);

WAPA_IPC_Login(m_sIp, 0);

WAPA_IPC_InitDec(HD_W, HD_H, 264, 1);
WAPA_IPC_InitDec(CIF_W, CIF_H, 264, 1);

g_pRenderCif[index] = new CD3DRender();
g_pRenderCif[index] -> InitD3D(hWndCif[index]);
g_pRenderCif[index] -> CreateOffScreen(HD_W, HD_H);

g_pRenderCif[index + 1] = new CD3DRender();
g_pRenderCif[index + 1] -> InitD3D(hWndCif[index + 1]);
g_pRenderCif[index + 1] -> CreateOffScreen(CIF_W, CIF_H);

SetTimer(1, 1000, (TIMERPROC )TimerProc);

yuyv_buf_s[index] = (unsigned char *)malloc(HD_W*HD_H*2);
WAPA_IPC_SetDataCallBack(Recvdata);
}
请高手再帮看看。。
sukney 2011-07-16
  • 打赏
  • 举报
回复

//移动侦测区域
typedef struct _DETECTRECT{
int width; //对应摄像机高清码流的宽度
int height; //对应摄像机高清码流的高度
BYTE block[20][15]; //将视频分割成64X48的分块,block为表示分块是否选中的二维数组,例:第二行第三和第十个分块被选中,则block[1][2] = 1,block[1][9] = 1,未被选中的为0
}DETECTRECT;

DLL_EXPORT int WAPA_IPC_OnPhoto(int index, unsigned char* pImageBuf, bool bPhoto); //对索引为index的画面拍照,pImageBuf为解码后的数据,bPhoto为true则是小码流拍照,为false则是大码流拍照。默认的存储路径是c:\image
DLL_EXPORT int WAPA_IPC_GoForward(int index); //快进
DLL_EXPORT int WAPA_IPC_StopPlay(int index); //停止回放索引为index的视频
DLL_EXPORT int WAPA_IPC_PausePlay(int index); //暂停回放索引为index的视频
DLL_EXPORT int WAPA_IPC_NormalPlayback(int index); //正常回放索引为index的视频
DLL_EXPORT int WAPA_IPC_PlayFrameForward(int index); //单帧进回放索引为index的视频
DLL_EXPORT DWORD WAPA_IPC_GetFileTime(int index); //获取索引为index的回放文件的总时间
DLL_EXPORT void WAPA_IPC_GetCurTime(int index, DWORD& hour, DWORD& minute, DWORD& second); //获取索引为index的回放文件的当前播放时间
DLL_EXPORT int WAPA_IPC_GoToPosition(int index, DWORD offTime); //设置索引为index的回放视频的跳转,跳转时间由offTime给出
DLL_EXPORT void WAPA_IPC_GetPositionTime( int index, DWORD& offTime ); //获取索引为index的回放视频的跳转时间
DLL_EXPORT int WAPA_IPC_SetPlaySpeed(int index, float rate); //设置索引为index的视频播放速度, 其中rate为播放的倍数,rate大于1为快速播放,小于1为慢速播放
DLL_EXPORT char *WAPA_IPC_GetMac(char* sCameraIP); //获得sCameraIP所指向字符串地址的网络摄像机的MAC地址
DLL_EXPORT int WAPA_IPC_GetCameraState(int index); //根据index获得摄像机的状态,若返回0则为未连接状态,1为连接状态
DLL_EXPORT int WAPA_IPC_SetAlarm(int CameraId, bool bAlarm, int AlarmType, int ComIndex, int Duration, bool bAlarmPhoto, bool bAlarmVedio); //设置索引为CameraId的摄像机的报警开关,其中bAlarm为TRUE则启动报警,为FALSE则关闭报警;
//AlarmType为0表示短路报警,为1表示断线报警;
//ComIndex为1表示选择左Alarm,为2表示选择右Alarm,为3表示选择的是左Alarm和右Alarm;
//Duration表示报警拍照时间,可以设置为30s, 60s, 90s,120s
//bAlarmPhoto为true,表示报警时启动拍照功能
//bAlarmVedio为true,表示报警时启动录像功能
DLL_EXPORT int WAPA_IPC_GetAlarmInfo(int index); //获取报警信息
DLL_EXPORT char* WAPA_IPC_GetPath(); //设置或选择路径,并返回所选定的路径
DLL_EXPORT int WAPA_IPC_Playback(HWND hWnd, int ScreenId, char *strPath); //在屏幕id为ScreenId的通道上回放路径为strPath的视频文件
DLL_EXPORT int WAPA_IPC_SetShowText(int index, char* text); //设置索引为index的摄像机是否显现文字

DLL_EXPORT int WAPA_IPC_Init(TVFORMAT tvf); //初始化SDK,tvf变量指定视频制式,0为PAL,1为NTSC
DLL_EXPORT int WAPA_IPC_Cleanup(); //释放SDK,在程序退出时使用,将关闭所有打开的摄像机连接


DLL_EXPORT int WAPA_IPC_SetDataCallBack(DataCallBack fData); //设置视频回调函数
DLL_EXPORT int WAPA_IPC_SetEventCallBack(EventCallBack fEvent); //设置事件回调函数

DLL_EXPORT int WAPA_IPC_Login(char* sCameraIP, int dataFormat = 0); //连接sCameraIP所指向字符串地址的网络摄像机,
//其中dataMode用来设置视频数据的格式,默认为PIX_FMT_DECODE_BEFORE(值为0),表示得到的数据是解码前的数据
//dataMode为PIX_FMT_YUYV422(值为1)表示得到的是解码后的YUV格式的数据
//dataMode为PIX_FMT_RGB24(值为2)表示得到的是解码后的RGB格式的数据,只有1080P的摄像机才支持此选项
//其中失败返回-1,成功返回摄像机索引,该索引可供后续操作使用
DLL_EXPORT int WAPA_IPC_Logout(int index); //断开与索引为index的网络摄像机的连接

DLL_EXPORT int WAPA_IPC_RealPlay(int index, HWND hWnd, BOOL bCif); //播放预览,index为摄像机索引,hWnd为显示预览的窗口句柄,bCif控制显示码流TRUE为小码流,FALSE为高清码流
DLL_EXPORT int WAPA_IPC_StopRealPlay(int index, BOOL bCif); //停止索引为index的摄像机视频预览,bCif为要停止预览的码流,同WAPA_IPC_RealPlay

DLL_EXPORT int WAPA_IPC_StartDecodeHD(int index); //开启索引为index的摄像机的高清码流解码
DLL_EXPORT int WAPA_IPC_StopDecodeHD(int index); //关闭索引为index的摄像机的高清码流解码
DLL_EXPORT int WAPA_IPC_StartDecodeCif(int index); //开启索引为index的摄像机的CIF码流解码
DLL_EXPORT int WAPA_IPC_StopDecodeCif(int index); //关闭索引为index的摄像机的CIF码流解码

DLL_EXPORT int WAPA_IPC_StartRecordHD(int index, char* pFileName); //开启索引为index的摄像机的高清码流录像,pFileName为指向文件名字符串的指针
DLL_EXPORT int WAPA_IPC_StopRecordHD(int index); //关闭索引为index的摄像机的高清码流录像
DLL_EXPORT int WAPA_IPC_StartRecordCif(int index, char* pFileName);//开启索引为index的摄像机的CIF码流录像,pFileName为指向文件名字符串的指针
DLL_EXPORT int WAPA_IPC_StopRecordCif(int index); //关闭索引为index的摄像机的CIF码流录像


DLL_EXPORT int WAPA_IPC_StartListen(int index); //开启索引为index的摄像机的声音监听,同一时刻只支持一路摄像机监听,多次调用时,监听最后调用的通道
DLL_EXPORT int WAPA_IPC_StopListen(); //关闭声音监听

DLL_EXPORT int WAPA_IPC_GetVersion(int index, DWORD& dwVersion); //获取索引为index的摄像机软件版本号,DWORD的四个字节依次保存4位的版本号
DLL_EXPORT int WAPA_IPC_UpdateCamera(int index, char* pFileName); //升级索引为index的摄像机程序,升级文件名为pFileName指向的字符串

DLL_EXPORT int WAPA_IPC_SET_IP(int index, long longIP); //设置索引为index的摄像机的IP地址,longIP为四字节的IPv4地址,longIP可由inet_addr转换IP字符串获得
DLL_EXPORT int WAPA_IPC_SET_Resolution(int index, int resolution); //设置索引为index的摄像机分辨率,对于720P的摄像机:resolution的值为2时画面比例为4:3,高清码流分辨率为960x720,标清码流分辨率为320x240;值为4时画面比例为16:9,高清码流分辨率为1280x720,标清码流分辨率为432x240;
//1080P的摄像机:resolution的值为2时画面比例为4:3,高清码流分辨率为1600x1200,标清码流分辨率为320x240;值为4时画面比例为16:9,高清码流分辨率为1920x1080,标清码流分辨率为432x240;
DLL_EXPORT int WAPA_IPC_SET_ManualReduce(int index, int reduce); //设置索引为index的摄像机强制降帧,reduce取值1-4,1为实时,2为1/2,3为1/4,4为1/4
DLL_EXPORT int WAPA_IPC_SET_AutoReduce(int index, int reduce); //设置索引为index的摄像机自动降帧,0为关闭,1为开启
DLL_EXPORT int WAPA_IPC_SET_EdgeGain(int index, int gain); //设置索引为index的摄像机边缘增强,0为关闭,1为开启
DLL_EXPORT int WAPA_IPC_SET_RGB(int index, int r, int g, int b); //设置索引为index的摄像机色彩,r、g、b为别代表红绿蓝
DLL_EXPORT int WAPA_IPC_SET_IRCard(int index, int oper); //设置索引为index的摄像机IR卡切换时间,oper取值0-100,0为提前,100为推后,仅适用于软切换模式
DLL_EXPORT int WAPA_IPC_SET_LightType(int index, int oper); //设置索引为index的摄像机光照类型,oper取值0或1,0为自然光,1为日光灯
DLL_EXPORT int WAPA_IPC_SET_Exposure(int index, int oper); //设置索引为index的摄像机曝光模式,0为亮处优先,1为偏暗,2为偏亮,3为暗处优先
DLL_EXPORT int WAPA_IPC_SET_DetectSens(int index, int sensitive); //设置索引为index的摄像机移动侦测灵敏度,sensitive取值0-4,0为最低,4为最高

DLL_EXPORT int WAPA_IPC_SET_DetectRect(int index, DETECTRECT rect);//设置索引为index的摄像机移动侦测区域,详见DETECTRECT结构体的说明

DLL_EXPORT int WAPA_IPC_PTZ_NormalControl(int index, int oper); //控制索引为index的高速球基本控制, oper取联合体NETOPERATE内的值
DLL_EXPORT int WAPA_IPC_PTZ_SetInfo(int index, BYTE oper,BYTE presetID=0, BYTE cruiseID=0, BYTE szSec=0, char* prename=0); //设置索引为index的高速球预置点信息和巡航组信息, presetID为预置点ID, cruiseID为巡航组ID, szSec为预置点停留时间, prename为预置点名称

DLL_EXPORT int WAPA_IPC_InitDec( int width, int height, int encodeFormat, int dataFormat); //初始化解码器,其中width,height为图像的长宽,
//encodeFormat为压缩数据格式(ENCODE_FORMAT_H264(264)是H264协议压缩格式,
//ENCODE_FORMAT_MPEG4(265)表示用的是MPEG4协议数据),
//dataFormat为输出视频数据的格式(DECODE_DATA_FORMAT_YUYV(1)表示YUYV格式,DECODE_DATA_FORMAT_RGB(2)为RGB格式)
//返回解码器的索引号
DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *instream, int istream_size, unsigned char *outstream); //解码,其中index为解码器的索引号,istream是编码数据,istream_size编码数据的大小,ostream为解码后的数据
DLL_EXPORT int WAPA_IPC_DestroyDec(int index); //销毁索引号为index的解码器
#endif

sukney 2011-07-16
  • 打赏
  • 举报
回复
还是报错。
C++全部原形,

#ifndef _WAPA_SDK_H
#define _WAPA_SDK_H

#define DLL_EXPORT extern "C" __declspec(dllexport)

#define WAPA_IPC_NOERROR 0 //没有错误
#define WAPA_IPC_INVALID_INDEX 1 //非法的摄像机索引
#define WAPA_IPC_NOT_LOGIN 2 //该索引未创建
#define WAPA_IPC_NOINIT 3 //没有初始化
#define WAPA_IPC_NETINIT_FAILED 4 //网络初始化失败
#define WAPA_IPC_PARAMETER_ERROR 5 //参数错误
#define WAPA_IPC_NETWORK_NOT_CONNECT 6 //摄像机未连接
#define WAPA_IPC_NETWORK_FAIL_CONNECT 7 //连接摄像机失败
#define WAPA_IPC_NETWORK_SEND_ERROR 8 //向摄像机发送失败
#define WAPA_IPC_NETWORK_RECV_ERROR 9 //从摄像机接收数据失败
#define WAPA_IPC_NETWORK_RECV_TIMEOUT 10 //从摄像机接收数据超时
#define WAPA_IPC_NETWORK_ERRORDATA 11 //传送的数据有误
#define WAPA_IPC_BUSY 12 //摄像机忙
#define WAPA_IPC_OPENHOSTSOUND_FAIL 13 //打开PC声音失败
#define WAPA_IPC_FILEOPENFAIL 14 //打开文件出错
#define WAPA_IPC_FILECHECKFAIL 15 //文件校验出错
#define WAPA_IPC_FILEFORMAT_ERROR 16 //文件格式不正确
#define WAPA_IPC_CREATESOCKET_ERROR 17 //创建SOCKET出错
#define WAPA_IPC_SETSOCKET_ERROR 18 //设置SOCKET出错
#define WAPA_IPC_IPMISMATCH 19 //IP地址不匹配
#define WAPA_IPC_MACMISMATCH 20 //MAC地址不匹配
#define WAPA_IPC_ALREADY_RECORDING 21 //已经在录像,不可重复开启
#define WAPA_IPC_FILE_ALREADY_EXIST 22 //创建文件失败,存在同名文件
#define WAPA_IPC_FILE_CREATE_FAILED 23 //创建新的文件失败
#define WAPA_IPC_FILE_WRITE_FAILED 24 //文件写入失败
#define WAPA_IPC_NODEC 25 //该解码器索引未创建
#define WAPA_IPC_NOSTREAM 26 //解码前的数据为空

#define ENCODE_FORMAT_H264 264 //H264协议压缩格式
#define ENCODE_FORMAT_MPEG4 265 //MPEG4协议数据
#define DECODE_DATA_FORMAT_YUYV 1 //输出视频数据的格式为YUYV
#define DECODE_DATA_FORMAT_RGB 2 //输出视频数据的格式为RGB

//DataCallBack type参数
// #define DATA_TYPE_HD 0 //高清视频数据
// #define DATA_TYPE_CIF 1 //cif视频数据
// #define DATA_TYPE_AUDIO 2 //音频数据

//DataCallBack type参数
#define DATA_TYPE_HD_YUV 0 //解码后的高清视频数据,YUYV
#define DATA_TYPE_CIF_YUV 1 //解码后的CIF视频数据,YUYV
#define DATA_TYPE_AUDIO 2 //音频数据
#define DATA_TYPE_HD_IFRAME 3 //未解码的高清视频数据,帧类型为I帧
#define DATA_TYPE_HD_PFRAME 4 //未解码的高清视频数据,帧类型为P帧
#define DATA_TYPE_CIF_IFRAME 5 //未解码的CIF视频数据,帧类型为I帧
#define DATA_TYPE_CIF_PFRAME 6 //未解码的CIF视频数据,帧类型为P帧

//视频回调函数,index为摄像机索引,type为帧类型,pData为指向长度为len的帧数据的指针,bMove为TRUE表示这一帧的图像有移动,param1、param2为图像宽高
typedef BOOL (CALLBACK *DataCallBack)(int index, int type, BYTE* pData, int len, int param1, int param2);
//事件回调函数,index为摄像机索引,type为事件类型
typedef BOOL (CALLBACK *EventCallBack)(int index, int type, int param1, int param2);

//事件类型
typedef enum{
IPC_CONNECT = 0, //连接到摄像机,如果param1和param2相等且都等于264,则表明该摄像机是200万高清摄像机。
IPC_DISCONNECT, //摄像机连接断开
IPC_MOTION, //移动侦测,画面移动
IPC_ALERT, //摄像机报警输入报警
};

//高速球控制码
//WAPA_IPC_PTZ_NormalContro()函数与WAPA_IPC_PTZ_SetInfo()函数第二个参数调用这些值
//基本控制是WAPA_IPC_PTZ_NormalContro()调用
//设置高速球信息为WAPA_IPC_PTZ_SetInfo()调用
typedef enum
{
UP = 0, //基本控制,上
DOWN, //基本控制,下
LEFT, //基本控制,左
RIGHT, //基本控制,右
FOCUSFAR, //基本控制,聚焦远
FOCUSNEAR, //基本控制,聚焦近
ZOOMWIDE, //基本控制,变倍长
ZOOMTELE, //基本控制,变倍短
IRISCLOSE, //基本控制,光圈关闭
IRISOPEN, //基本控制,光圈打开


//老版本的预置点必须且只能属于一个特定的巡航组
SETPRESET=19, //老版本添加预置点,要给出预置点ID,巡航组ID,时间,预置点名称
CLEARPRESET, //老版本删除预置点,要给出预置点ID,巡航组ID
GOPRESET, //老版本跑到该预置点,要给出预置点ID,巡航组ID

PANSTOP=23, //基本控制,停止左右
TILTSTOP, //基本控制,停止上下
ZOOMSTOP, //基本控制,停止变倍
FOCUSSTOP, //基本控制,停止变焦

AUTOFOCUS = 50, //基本控制,自动聚焦
MANUALFOCUS = 51, //基本控制,手动聚焦

PTZ_PAN_SPEED=53, //设置高速球信息 设置高速球水平转动的速度,第五个参数为panspeed值,范围1到200
PTZ_TILT_SPEED, //设置高速球信息, 设置高速球垂直转动的速度,第五个参数为tiltspeed值,范围1到60

PTZ_SETZEROPOS=57, //基本控制,初始化高速球位置
PTZ_CRUISE_ON = 80, //设置高速球信息,给定巡航组ID,开启巡航
PTZ_CRUISE_OFF, //设置高速球信息,给定巡航组ID,停止巡航
PTZ_ADD_PRESET=82, //设置高速球信息,增加预置点ID和名称,预置点名称长度为24字节
PTZ_REMOVE_PRESET, //设置高速球信息,删除预置点ID和名称
PTZ_ADD_PRESET_TO_PATH, //设置高速球信息,添加预置点至巡航路径,给定预置点ID,巡航组ID,停留时间,预置点名称
PTZ_REMOVE_PRESET_FROM_PATH, //设置高速球信息,添加预置点至巡航路径,给定预置点ID,巡航组ID,停留时间,预置点名称
PTZ_GET_PRESETINFO, //基本控制,获取预置点信息
PTZ_GET_CRUISEINFO, //基本控制,获取巡航组信息
PTZ_SET_DZOOM_ON, //基本控制,设置数字放大开
PTZ_SET_DZOOM_OFF, //基本控制,设置数字放大关

} NETOPERATE;

//视频制式枚举
typedef enum {
PAL = 0,
NTSC
}TVFORMAT;
isjoe 2011-07-16
  • 打赏
  • 举报
回复
对于你的调用unsigned char *应该用byte[]取代

且必须为instream、outstream分配明确的大小。
lizhibin11 2011-07-16
  • 打赏
  • 举报
回复
CallingConvention = CallingConvention.Cdecl 为什么要调用方清理堆栈?把这个去掉,这个应该是问题所在,或者改为CallingConvention.StdCall。
unsigned char*最好用Byte数组,不过错误不在这里。

110,523

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧