最近需要做一个C#版本的控制终端,控制摄像头,获取摄像头的水平角度和垂直角度
获取当前摄像头的角度,需要调用一个名为NET_DVR_GetDVRConfig的bool类型的函数
在C++中,函数定义:NET_DVR_GetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel, LPVOID lpOutBuffer, DWORD dwOutBufferSize, LPDWORD lpBytesReturned)
在C#封装过程中,函数改为:
[DllImport(@"HCNetSDK.dll")]
public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, IntPtr lpOutBuffer, uint dwOutBufferSize, ref uint lpBytesReturned);
在调用的过程中,主要是第四个参数的转换遇到了问题
首先看一下C++Demo里面的函数用法:
1 NET_DVR_PTZPOS m_ptzPos = {0}; 2 DWORD dwReturned; 3 BOOL bRet = NET_DVR_GetDVRConfig(m_lUserID[m_struSlaveCameraCond.byID], NET_DVR_GET_PTZPOS, 0, &m_ptzPos, sizeof(NET_DVR_PTZPOS), &dwReturned); 4 if (!bRet) 5 { 6 g_pMainDlg->AddLog(m_iDeviceIndex, OPERATION_FAIL_T, "NET_DVR_GET_PTZPOS"); 7 return; 8 } 9 10 int m_iPara1 = HexToDecMa(m_ptzPos.wPanPos); 11 int m_iPara2 = HexToDecMa(m_ptzPos.wTiltPos); 12 int m_iPara3 = HexToDecMa(m_ptzPos.wZoomPos);
首先结构体实例化 ,传入对应的参数,返回bool类型的值,值为True时,获取结构体里面的值
在c#中,传递的第四个参数的类型由LPVOID 类型的转化为了IntPtr类型的
首先两篇文档:Marshal.StructureToPtr方法,Marshal.PtrToStructure方法
了解了Intptr与架构体之间的相互转化,就好处理了,代码如下:
1 //首先获取当前结构体的长度 2 int nSizeOfPtz = Marshal.SizeOf(Ptz); 3 //定义一个IntPtr类型的数据 4 IntPtr intPtr = Marshal.AllocHGlobal(nSizeOfPtz); 5 DevideAngle = CHCNetSDK.NET_DVR_GetDVRConfig(_mLUserId, CHCNetSDK.NET_DVR_GET_PTZPOS, 0, intPtr, (uint)nSizeOfPtz, ref dwReturned); 6 //IntPtr数据转换成Struct结构体 7 Ptz = (CHCNetSDK.NET_DVR_PTZPOS)Marshal.PtrToStructure(intPtr, typeof(CHCNetSDK.NET_DVR_PTZPOS)); 8 Pan = HexToDecMa(Ptz.wPanPos); 9 Tit = HexToDecMa(Ptz.wTiltPos);