C# 封裝SDK 獲取攝像頭的水平角度和垂直角度


最近需要做一個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);
C++獲取角度

首先結構體實例化 ,傳入對應的參數,返回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);
C#獲取角度

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM