大华API调用

andson_wang 2012-09-10 01:41:20
以下是浙江大华API的接口函数原型以及相关结构声明:

查询局域网设备

BOOL CLIENT_SearchDevices(
char* szBuf,
int nBufLen,
int* pRetLen,
DWORD dwSearchTime
);
Parameters
[out]szBuf
用户开辟缓存,用来接收DEVICE_NET_INFO结构体,查询到几个设备,就返回几个这样的结构体
[in]nBufLen
szBuf缓存长度
[out]pRetLen
返回DEVICE_NET_INFO结构体长度之和
[in]dwSearchTime
查询等待时间


结构定义如下:

DEVICE_NET_INFO{
char szIP[DH_MAX_IPADDR_LEN];
int nPort;
char szSubmask[DH_MAX_IPADDR_LEN];
char szGateway[DH_MAX_IPADDR_LEN];
char szMac[DH_MACADDR_LEN];
char szDeviceType[DH_DEV_TYPE_LEN];
BYTE bReserved[32];
};


我在C#环境中想调用此接口函数,我的声明以及调用代码如下:

C#中结构声明:

[StructLayout(LayoutKind.Sequential)]
public struct DEVICE_NET_INFO
{
/// <summary>
/// IP地址
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] szIP;

/// <summary>
/// 端口
/// </summary>
public int nPort;

/// <summary>
/// 子网掩码
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] szSubmask;

/// <summary>
/// 网关
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] szGateway;

/// <summary>
/// Mac
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public byte[] szMac;

/// <summary>
/// 设备类型
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szDeviceType;

/// <summary>
/// 保留字节
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] bReserverd;

}

C#中接口函数声明:
[DllImport("dhnetsdk.dll")]
private static extern bool CLIENT_SearchDevices([Out,MarshalAs(UnmanagedType.LPArray)] DEVICE_NET_INFO[] dni, int nBufLen, out int pRetLen, int dwSearchTime);

C#中调用代码如下:

DEVICE_NET_INFO[] dni;
dni = new DEVICE_NET_INFO[100];
int pRetLen = 0;
int uSearchTime = 5000;
bool ret = DHClient.DHSearchDevices(dni, 100 * Marshal.SizeOf(typeof(DEVICE_NET_INFO)), out pRetLen, uSearchTime);

调用不成功,每次都是返回False,请大人帮忙解决,谢谢!!!
...全文
1419 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2012-09-10
  • 打赏
  • 举报
回复
char*为什么到C#用byte[]?
建议用
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = size)]
替代
andson_wang 2012-09-10
  • 打赏
  • 举报
回复
自己顶起来
andson_wang 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你在确保长度一致的情况下,试试
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
[/Quote]

可以细说吗?
bdmh 2012-09-10
  • 打赏
  • 举报
回复
你在确保长度一致的情况下,试试
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]

111,097

社区成员

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

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

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