首页 新闻 搜索 专区 学院

奇怪的C++接口,不知道怎样PInvoke到C#。翘首企盼高手解决,感激涕零!!

0
悬赏园豆:10 [已解决问题] 解决于 2012-09-11 15:29

CLIENT_QueryDevState

获取前端设备的当前工作状态

BOOL CLIENT_QueryDevState(
  LONG  lLoginID,
  int   nType,
  char  *pBuf,
  int   nBufLen,
  int   *pRetLen,
  int   waittime=1000
);

Parameters

[in]lLoginID
CLIENT_Login的返回值
[in]nType
查询信息类型
[out]pBuf
输出参数,用于接收查询返回的数据的缓存。根据查询类型的不同,返回数据的数据结构也不同
[in]nBufLen
缓存长度,单位字节
[out]pRetLen
输出参数,实际返回的数据长度,单位字节
[in]waittime
查询状态等待时间,默认1000ms

Return Values

成功返回TRUE,失败返回FALSE。

Remarks

获取设备的当前工作状态,当 nType= DH_DEVSTATE_BURNING_PROGRESS时,*pRetLen表示要查询设备的id(0,1,2,……)号。

nType查询类型对应的结构体
DH_DEVSTATE_COMM_ALARM 普通报警状态(包括外部报警,动态检测,视频丢失) NET_CLIENT_STATE支持16路以下 NET_CLIENT_STATE_EX支持32以下
DH_DEVSTATE_SHELTER_ALARM 遮挡报警状态 16字节
DH_DEVSTATE_RECORDING 录象状态 16字节
DH_DEVSTATE_RESOURCE 查询系统资源状态 3个DWORD
DH_DEVSTATE_BITRATE 查询通道码流 通道数乘以DWORD
DH_DEVSTATE_CONN 查询设备连接状态 DWORD
DH_DEVSTATE_DISK 硬盘状态 DH_HARDDISK_STATE
DH_DEVSTATE_PROTOCAL_VER 网络协议版本号 int
DH_DEVSTATE_TALK_ECTYPE 查询设备支持的语音对讲格式 DHDEV_TALKFORMAT_LIST
DH_DEVSTATE_SD_CARD 查询sd卡信息 DH_SDCARD_STATE同DH_HARDDISK_STATE结构体一样
DH_DEVSTATE_BURNING_DEV 查询刻录机信息 DH_BURNING_DEVINFO
DH_DEVSTATE_BURNING_PROGRESS 查询刻录进度 DH_BURNING_PROGRESS
DH_DEVSTATE_CAMERA 查询摄像头属性信息 DHDEV_CAMERA_INFO
DH_DEVSTATE_SOFTWARE 设备软件信息 DHDEV_VERSION_INFO
DH_DEVSTATE_LANGUAGE 设备语言支持信息 DH_DEV_LANGUAGE_INFO
DH_DEVSTATE_DSP 查询dsp能力描述 DHDEV_DSP_ENCODECAP
DH_DEVSTATE_OEM 查询oem信息 DHDEV_OEM_INFO
DH_DEVSTATE_NET 查询网络运行状态信息 DHDEV_TOTAL_NET_STATE
DH_DEVSTATE_TYPE 查询设备类型 字符串
DH_DEVSTATE_SNAP 查询抓图功能属性(IPC类产品) DH_SNAP_ATTR_EN
DH_DEVSTATE_RECORD_TIME 查询最早录像时间和最近录像时间 DEV_DISK_RECORD_INFO
DH_DEVSTATE_NET_RSSI 查询无线网络信号强度 DHDEV_WIRELESS_RSS_INFO
DH_DEVSTATE_BURNING_ATTACH 查询附件刻录选项 BOOL
DH_DEVSTATE_BACKUP_DEV 查询备份设备详细信息 DHDEV_BACKUP_LIST
DH_DEVSTATE_BACKUP_FEEDBACK 备份进度反馈 DHDEV_BACKUP_FEEDBACK
DH_DEVSTATE_ATM_QUERY_TRADE 查询ATM交易类型 DH_ATM_QUERY_TRADE
DH_DEVSTATE_SIP 查询sip状态 DHDEV_SIP_STATE
DH_DEVSTATE_VICHILE_STATE 查询车载wifi状态 DHDEV_VEHICLE_WIFI_STATE
DH_DEVSTATE_TEST_EMAIL 查询邮件配置是否成功 DHDEV_FUNC_TEST
DH_DEVSTATE_SMART_HARD_DISK 查询硬盘smart信息 DHDEV_SMART_HARDDISK
DH_DEVSTATE_TEST_SNAPPICTURE 查询抓图设置是否成功 DHDEV_FUNC_TEST
DH_DEVSTATE_STATIC_ALARM 查询静态报警状态 DWORD,每一位表示一个报警通道
DH_DEVSTATE_SUBMODULE_INFO 查询设备子模块信息 DHDEV_SUBMODULE_INFO
DH_DEVSTATE_DISKDAMAGE 查询硬盘坏道能力 DHDEV_SUBMODULE_INFO
DH_DEVSTATE_IPC 查询设备支持的IPC能力 DH_DEV_IPC_INFO
DH_DEVSTATE_ALARM_ARM_DISARM 查询报警布撤防状态 ALARM_ARM_DISARM_STATE_INFO
DH_DEVSTATE_ACC_POWEROFF_ALARM 查询ACC断电报警状态 返回一个DWORD, 1表示断电,0表示通电
DH_DEVSTATE_TEST_FTP_SERVER 测试FTP服务器连接 DHDEV_FTP_SERVER_TEST
DH_DEVSTATE_3GFLOW_EXCEED 查询3G流量超出阈值状态 DHDEV_3GFLOW_EXCEED_STATE_INFO

 

See Also

CLIENT_Login

TigerSpringLiu的主页 TigerSpringLiu | 初学一级 | 园豆:196
提问于:2012-09-11 14:15
< >
分享
最佳答案
0

这个不奇怪吧,C/C++ DLL的导出函数大多都是这样子的。而且这玩意儿也永不着高手解决。

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2012-09-11 14:20

你好,

关键是第三个参数,使用什么类型呢呢?

string, StringBuilder, byte, byte[] 我都试过了

TigerSpringLiu | 园豆:196 (初学一级) | 2012-09-11 14:23

DHDEV_TALKFORMAT_LIST m_lstTalkEncode;

BOOL bSuccess = CLIENT_QueryDevState(m_lLoginHandle, DH_DEVSTATE_TALK_ECTYPE, (char*)&m_lstTalkEncode, sizeof(DHDEV_TALKFORMAT_LIST), &retlen, 2000);

C++源码里的调用,

我不知道该怎么再把pBuf返回值转换为DHDEV_TALKFORMAT_LIST类型

要使用指针吗?

TigerSpringLiu | 园豆:196 (初学一级) | 2012-09-11 14:27

@TigerSpringLiu: 如果真是char*的话,参看这个例子:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4e387bb3-6b99-4b9d-91bb-9ec00c47e3a4/

但是,从你提供的C++代码来看,这个char*表示一个结构体,那么你应该在你的C#中也写一个同样的结构体:

struct DHDEV_TALKFORMAT_LIST{}

然后你可以在签名中使用:ref DHDEV_TALKFORMAT_LIST 来传入参数。

Launcher | 园豆:45045 (高人七级) | 2012-09-11 14:32

@Launcher: 

你说的这个方法也试了,但是一样不行的。

当然,struct DHDEV_TALKFORMAT_LIST{}肯定是定义了的,这不需要您这样的高手说了

TigerSpringLiu | 园豆:196 (初学一级) | 2012-09-11 15:12

@TigerSpringLiu: 如果接口里是 char* ,你可以用byte[] 数组,然后Marshal.UnsafeAddrOfPinnedArrayElement 来得到指针,然后传给 char* 参数。如果是结构体,你可以用 Marshal.StructureToPtr 来得到指针,然后传给 void* 参数。

 

关键就看 CLIENT_QueryDevState 中,对char* 咋处理的,C++中直接使用的struct指针,那么原 CLIENT_QueryDevState 的参数类型不是 DHDEV_LIST*的话,就只能是LPVOID,除非它typedef  char DHDEV_LIST了。

Launcher | 园豆:45045 (高人七级) | 2012-09-11 15:18

@Launcher: 

多谢关注,貌似解决了,确实是应该使用IntPtr。

http://www.cnblogs.com/badnewfish/archive/2009/11/10/1599648.html 还是这位哥的正解。

以后还向您多多请教,谢了!

TigerSpringLiu | 园豆:196 (初学一级) | 2012-09-11 15:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册