在VC++里关于视频图像的编程时会经常看到这样的函数,它的一个参数表示某块内存的起始地址,另一个参数表示这块内存的长度,比如在黄河数字SDK里会看到这样的函数:
HHNET_SetServerConfig(IN HANDLE hServer,
IN HHCMD_NET nConfigCommand,
IN char *pConfigBuf,
IN UINT nConfigBufSize,
IN DWORD dwAppend=0);
这个函数的第三个参数pConfigBuf表示某块内存的起始地址,而第四个参数nConfigBufSize表示这块内存的长度,这个函数的主要功能是设置IPCamer或DVS的参数。
下面讲解用这个函数来设置IPCamer的时钟,使之与PC同步,在C#里实现。
首先这个函数在黄河数字SDK的网络库HHNetClient.dll,把这库在C#里导入,导入如下:
[DllImport("HHNetClient.dll", EntryPoint = "HHNET_SetServerConfig", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern HHERR_CODE HHNET_SetServerConfig(IntPtr hLogonServer, HHCMD_NET HHCMD_Config, IntPtr pConfig, uint pConfigSize, int dwAppend);
设置时钟对应的命令是:HHCMD_SET_TIME,
对应的结构体是:typedef struct DVS_DATE
{
BYTE year;
BYTE month;
BYTE day;
BYTE week;
BYTE hour;
BYTE minute;
BYTE second;
}DVS_DATE,这些说明在黄河数字SDK使用手册上面有详细说明,在这里不做深入说明
定义一个DVS_DATE的变量,然后赋值,如何把这个变量传入上面的函数呢,如果在VC++里的话很容易,直接获取变量的地址,把它强制转换成char*即可,但是在C#里需要转换,使用Marshal.StructureToPtr()将结构体转换成IntPtr。转换如下:
DateTime PCTime = DateTime .Now ;
DVS_DATE PCDateTime;
PCDateTime.year = (byte)(PCTime.Year & 0x0f);
PCDateTime.month = (byte)PCTime.Month;
PCDateTime.day = (byte)PCTime.Day;
PCDateTime.week = (byte)PCTime.DayOfWeek;
PCDateTime.hour = (byte)PCTime.Hour;
PCDateTime.minute = (byte)PCTime.Minute;
PCDateTime.second = (byte)PCTime.Second;
IntPtr ptr = Marshal.AllocHGlobal( Marshal.SizeOf(PCDateTime));
Marshal.StructureToPtr(PCDateTime,ptr,true);
然后将ptr传入函数即可,如下:
HHERR_CODE result = HHNET_SetServerConfig(hLogon, HHCMD_NET.HHCMD_SET_TIME, ptr, (uint)Marshal.SizeOf(PCDateTime), 0);
以上是我用C#开发的过程中的一点个人见解,希望能对网友有用