请问怎样把以下C++函数修改为C#函数,主要是不知LPVOID怎样改?

ab_study_c 2010-06-18 08:00:45
请问怎样把以下C++函数修改为C#函数,主要是不知LPVOID怎样改?

BOOL NET_DVR_GetDVRConfig(
LONG lUserID,
DWORD dwCommand,
LONG lChannel,
LPVOID lpOutBuffer,
DWORD dwOutBufferSize,
LPDWORD lpBytesReturned
);
Parameters
lUserID
[in] NET_DVR_Login或NET_DVR_Login_V30的返回值
dwCommand
[in] 设备配置命令,参见配置命令
lChannel
[in] 通道号,如果命令不需要通道号,该参数无效,置为0xFFFFFFFF即可
lpOutBuffer
[out] 接收数据的缓冲指针
dwOutBufferSize
[in] 接收数据的缓冲长度(以字节为单位),不能为0
lpBytesReturned
[out] 实际收到的数据长度指针,不能为NULL
...全文
218 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazj 2011-10-18
  • 打赏
  • 举报
回复
请问楼主解决了没有,我是一模一样的问题
捷哥1999 2010-06-19
  • 打赏
  • 举报
回复
BOOL NET_DVR_GetDVRConfig(
LONG lUserID,
DWORD dwCommand,
LONG lChannel,
LPVOID lpOutBuffer,
DWORD dwOutBufferSize,
LPDWORD lpBytesReturned
);

参数对应:
LONG -->System.Int32
DWORD-->System.UInt32
LPVOID-->ref byte[]
LPDWORD->ref byte[]

[DllImport("yourdll.dll")]
public static extern bool NET_DVR_GetDVRConfig(
Int32 lUserID,
UInt32 dwCommand,
Int32 lChannel,
ref byte[] lpOutBuffer,
UInt32 dwOutBufferSize,
ref uint lpBytesReturned
);


然后这么调用!
NET_DVR_GetDVRConfig(lUserID,100,1,ref lpOutBuffer,100,ref lpBytesReturned)
doubleu2005 2010-06-19
  • 打赏
  • 举报
回复
out IntPtr lpOutBuffer,没有out,直接 IntPtr lpOutBuffer,
out uint lpBytesReturned也不对,看看下面的

public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, IntPtr lpOutBuffer, uint dwOutBufferSize, ref uint lpBytesReturned) ;
ab_study_c 2010-06-19
  • 打赏
  • 举报
回复
少写了一处,
NET_DVR_GetDVRConfig(lUserID,100,1,out IntPtr lpOutBuffer,100,out uint lpBytesReturned)
是这个调用出错.
ab_study_c 2010-06-19
  • 打赏
  • 举报
回复
改为
NET_DVR_GetDVRConfig(lUserID,100,out IntPtr lpOutBuffer,100,out uintlpBytesReturned)

运行又报"参数错误".

不知哪一个参数搞错了.请指点
ab_study_c 2010-06-19
  • 打赏
  • 举报
回复
原C++为:

#define NET_DVR_GET_NETCFG_V30 1000 //获取网络参数

typedef struct
{
DWORD dwSize;
NET_DVR_ETHERNET_V30 struEtherNet[MAX_ETHERNET]; //以太网口
NET_DVR_IPADDR struRes1[2]; /*保留*/
NET_DVR_IPADDR struAlarmHostIpAddr; /* 报警主机IP地址 */
WORD wRes2[2]; /* 保留 */
WORD wAlarmHostIpPort; /* 报警主机端口号 */
BYTE byUseDhcp; /* 是否启用DHCP 0xff-无效 0-不启用 1-启用*/
BYTE byRes3;
NET_DVR_IPADDR struDnsServer1IpAddr; /* 域名服务器1的IP地址 */
NET_DVR_IPADDR struDnsServer2IpAddr; /* 域名服务器2的IP地址 */
BYTE byIpResolver[MAX_DOMAIN_NAME]; /* IP解析服务器域名或IP地址 */
WORD wIpResolverPort; /* IP解析服务器端口号 */
WORD wHttpPortNo; /* HTTP端口号 */
NET_DVR_IPADDR struMulticastIpAddr; /* 多播组地址 */
NET_DVR_IPADDR struGatewayIpAddr; /* 网关地址 */
NET_DVR_PPPOECFG struPPPoE;
BYTE byRes[64];
} NET_DVR_NETCFG_V30, *LPNET_DVR_NETCFG_V30;

BOOL NET_DVR_GetDVRConfig(
LONG lUserID,
DWORD dwCommand,
LONG lChannel,
LPVOID lpOutBuffer,
DWORD dwOutBufferSize,
LPDWORD lpBytesReturned
);
说明:
Parameters
lUserID
[in] NET_DVR_Login或NET_DVR_Login_V30的返回值
dwCommand
[in] 设备配置命令,参见配置命令
lChannel
[in] 通道号,如果命令不需要通道号,该参数无效,置为0xFFFFFFFF即可
lpOutBuffer
[out] 接收数据的缓冲指针
dwOutBufferSize
[in] 接收数据的缓冲长度(以字节为单位),不能为0
lpBytesReturned
[out] 实际收到的数据长度指针,不能为NULL
Return Values
TRUE表示成功,FALSE表示失败,获取错误码调用NET_DVR_GetLastError

Remarks
不同的获取功能对应不同的结构体和命令号,如下表所示:


dwCommand宏定义 dwCommand含义 lpOutBuffer对应结构体 宏定义值
NET_DVR_GET_DEVICECFG 获取设备参数 NET_DVR_DEVICECFG 100
NET_DVR_GET_TIMECFG 获取时间参数 NET_DVR_TIME 118
NET_DVR_GET_NETCFG 获取网络参数 NET_DVR_NETCFG 102
NET_DVR_GET_NETCFG_V30 获取网络参数 NET_DVR_NETCFG_V30 1000
NET_DVR_GET_PICCFG 获取图像参数 NET_DVR_PICCFG 104
NET_DVR_GET_PICCFG_EX 获取图像参数(扩展) NET_DVR_PICCFG_EX 200
NET_DVR_GET_PICCFG_V30 获取图像参数 NET_DVR_PICCFG_V30 1002
NET_DVR_GET_COMPRESSCFG 获取压缩参数 NET_DVR_COMPRESSIONCFG 106
NET_DVR_GET_EVENTCOMPCFG 获取事件触发录像参数 NET_DVR_COMPRESSIONCFG 132
NET_DVR_GET_COMPRESSCFG_EX 获取压缩参数(扩展) NET_DVR_COMPRESSIONCFG_EX 204
NET_DVR_GET_COMPRESSCFG_V30 获取压缩参数 NET_DVR_COMPRESSIONCFG_V30 1040
.......

程序中:
NET_DVR_NETCFG_V30 struNetCfg;
DWORD dwReturned = 0;

调用为:
NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_NETCFG_V30, 0, &struNetCfg, sizeof(NET_DVR_NETCFG_V30), &dwReturned)

现改为C#:
public const int NET_DVR_GET_NETCFG_V30 = 1000;

public struct NET_DVR_NETCFG_V30
{
public uint dwSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = HCNetSDK.MAX_ETHERNET)]
public NET_DVR_ETHERNET_V30[] struEtherNet;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public NET_DVR_IPADDR[] struRes1;
public NET_DVR_IPADDR struAlarmHostIpAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public ushort[] wRes2;
public ushort wAlarmHostIpPort;
public byte byUseDhcp;
public byte byRes3;
public NET_DVR_IPADDR struDnsServer1IpAddr;
public NET_DVR_IPADDR struDnsServer2IpAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = HCNetSDK.MAX_DOMAIN_NAME)]
public byte[] byIpResolver;
public ushort wIpResolverPort;
public ushort wHttpPortNo;
public NET_DVR_IPADDR struMulticastIpAddr;
public NET_DVR_IPADDR struGatewayIpAddr;
public NET_DVR_PPPOECFG struPPPoE;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] byRes;
}

[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, out byte[] lpOutBuffer, uint dwOutBufferSize, out uint lpBytesReturned);

调用:不知参数:lpOutBuffer,dwOutBufferSize该怎样定义和赋值?

ab_study_c 2010-06-19
  • 打赏
  • 举报
回复
已经调试两天了,还没有调试通,好烦哟
ab_study_c 2010-06-19
  • 打赏
  • 举报
回复
最开始就是这样定义的:

[DllImport("yourdll.dll")]
public static extern bool NET_DVR_GetDVRConfig(
Int32 lUserID,
UInt32 dwCommand,
Int32 lChannel,
ref byte[] lpOutBuffer,
UInt32 dwOutBufferSize,
ref uint lpBytesReturned
);

程序运行到NET_DVR_GetDVRConfig(lUserID,100,1,ref lpOutBuffer,100,ref lpBytesReturned)
调用时一直停在那里了。
doubleu2005 2010-06-18
  • 打赏
  • 举报
回复
改为IntPtr lpOutBuffer,试试


ab_study_c 2010-06-18
  • 打赏
  • 举报
回复
另外,需要说明的是:
dwCommand宏定义 dwCommand含义 lpOutBuffer对应结构体 宏定义值
NET_DVR_GET_DEVICECFG 获取设备参数 NET_DVR_DEVICECFG 100
NET_DVR_GET_TIMECFG 获取时间参数 NET_DVR_TIME 118
NET_DVR_GET_NETCFG 获取网络参数 NET_DVR_NETCFG 102
NET_DVR_GET_NETCFG_V30 获取网络参数 NET_DVR_NETCFG_V30 1000
NET_DVR_GET_PICCFG 获取图像参数 NET_DVR_PICCFG 104
NET_DVR_GET_PICCFG_EX 获取图像参数(扩展) NET_DVR_PICCFG_EX 200
ab_study_c 2010-06-18
  • 打赏
  • 举报
回复
不得行。运行后一直停在那里了。
兔子-顾问 2010-06-18
  • 打赏
  • 举报
回复
[DllImport("yourdll.dll")]
public static extern bool NET_DVR_GetDVRConfig(
long lUserID,
uint dwCommand,
long lChannel,
ref byte[] lpOutBuffer,
uint dwOutBufferSize,
ref uint lpBytesReturned
);


试试看行不行。

110,534

社区成员

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

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

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