注册表API函数和获取系统版本

来源:互联网 发布:库房库存数据分析 编辑:程序博客网 时间:2024/06/06 10:46

开发过程中,遇到一些访问注册表的函数,这里贴几个看着常用的函数。

RegOpenKeyEx:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724897(v=vs.85).aspx
RegCreateKeyEx:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724844(v=vs.85).aspx
RegQueryValueEx:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx
RegCloseKey:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724837(v=vs.85).aspx
RegQueryInfoKey:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724902(v=vs.85).aspx
RegEnumKeyEx:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724862(v=vs.85).aspx
RegEnumValue:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724865(v=vs.85).aspx

//打开某个注册表项LONG WINAPI RegOpenKeyEx(  _In_     HKEY    hKey,  _In_opt_ LPCTSTR lpSubKey,  _In_     DWORD   ulOptions,  _In_     REGSAM  samDesired,  _Out_    PHKEY   phkResult);//hKey参数可以是通过RegOpenKeyEx或RegCreateKeyEx返回的有效HKEY值,也可以是以下值:/*HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERS*///lpSubKey参数是要打开的子项的字符串//ulOptions参数可设置为0或REG_OPTION_OPEN_LINK,常为0//samDesired参数类似文件操作中的OpenMode吧,一般有KEY_READ、KEY_WRITE、KEY_EXECUTE等//phkResult参数用于接收返回的HKEY句柄,使用完后要用RegCloseKey关闭。
//创建或打开某个注册表项LONG WINAPI RegCreateKeyEx(  _In_       HKEY                  hKey,  _In_       LPCTSTR               lpSubKey,  _Reserved_ DWORD                 Reserved,//NULL  _In_opt_   LPTSTR                lpClass,//NULL  _In_       DWORD                 dwOptions,  _In_       REGSAM                samDesired,  _In_opt_   LPSECURITY_ATTRIBUTES lpSecurityAttributes,  _Out_      PHKEY                 phkResult,  _Out_opt_  LPDWORD               lpdwDisposition);
//获取某个键的值LONG WINAPI RegQueryValueEx(  _In_        HKEY    hKey,  _In_opt_    LPCTSTR lpValueName,//要获得值的键名  _Reserved_  LPDWORD lpReserved,//为NULL  _Out_opt_   LPDWORD lpType,//标识接受的数据是什么类型  _Out_opt_   LPBYTE  lpData,//接收值的缓冲区  _Inout_opt_ LPDWORD lpcbData//缓冲区大小和实际接受大小);
//关闭HKEY句柄LONG WINAPI RegCloseKey(  _In_ HKEY hKey);
//获取表项中的信息LONG WINAPI RegQueryInfoKey(  _In_        HKEY      hKey,  _Out_opt_   LPTSTR    lpClass,//可为NULL  _Inout_opt_ LPDWORD   lpcClass,//可为NULL  _Reserved_  LPDWORD   lpReserved,//NULL  _Out_opt_   LPDWORD   lpcSubKeys,//接收该项下有多少个子项,可为NULL  _Out_opt_   LPDWORD   lpcMaxSubKeyLen,//接收该项下最长子项的长度,可为NULL  _Out_opt_   LPDWORD   lpcMaxClassLen,//可为NULL  _Out_opt_   LPDWORD   lpcValues,//接收该项下有多少个直属键值,可为NULL  _Out_opt_   LPDWORD   lpcMaxValueNameLen,//接收该项下最长键的长度,可为NULL  _Out_opt_   LPDWORD   lpcMaxValueLen,//接受该项下最长值的长度,可为NULL  _Out_opt_   LPDWORD   lpcbSecurityDescriptor,//安全选项,可为NULL  _Out_opt_   PFILETIME lpftLastWriteTime//最后写入时间,可为NULL);//获取到的项数目和键值数目与实际在windows下通过注册表工具看到的并不一样,总是少于或等于,可能与访问权限有关。

一般,通过RegQueryInfoKey得知子项数目和子键值数目后,可通过RegEnumKeyEx或RegEnumValue获取信息。

//参数很直观。LONG WINAPI RegEnumKeyEx(  _In_        HKEY      hKey,  _In_        DWORD     dwIndex,  _Out_       LPTSTR    lpName,  _Inout_     LPDWORD   lpcName,  _Reserved_  LPDWORD   lpReserved,  _Inout_     LPTSTR    lpClass,  _Inout_opt_ LPDWORD   lpcClass,  _Out_opt_   PFILETIME lpftLastWriteTime);LONG WINAPI RegEnumValue(  _In_        HKEY    hKey,  _In_        DWORD   dwIndex,  _Out_       LPTSTR  lpValueName,  _Inout_     LPDWORD lpcchValueName,  _Reserved_  LPDWORD lpReserved,  _Out_opt_   LPDWORD lpType,  _Out_opt_   LPBYTE  lpData,  _Inout_opt_ LPDWORD lpcbData);

上面这些函数执行成功返回值为ERROR_SUCCESS,在很多情况下有些注册表在非管理员权限下无权访问,那么就要注意判断返回值再执行后续操作。

另外,由于系统不一样,导致的注册表也会有所差别,那可以根据系统版本来区分对待。
下面2个获取系统版本信息的函数(就windows而言)

DWORD WINAPI GetVersion(void);BOOL WINAPI GetVersionEx(  _Inout_ LPOSVERSIONINFO lpVersionInfo);//OSVERSIONINFO结构如下:typedef struct _OSVERSIONINFO {  DWORD dwOSVersionInfoSize;//设置为sizeof(OSVERSIONINFO)  DWORD dwMajorVersion;  DWORD dwMinorVersion;  DWORD dwBuildNumber;  DWORD dwPlatformId;//PlatformId一般返回2,VER_PLATFORM_WIN32_NT  TCHAR szCSDVersion[128];// such as "Service Pack 3",如果没有Service Pack则为空字符串} OSVERSIONINFO;

GetVersion直接返回一个DWORD值,低8位为主版本号,低16位的高8位为次版本号,高16位为构建版本号(BuildNumber,我也不知道该怎么译好。。)
可以用LOWORD(),LOBYTE()这些宏来获取。
而GetVersionEx会填充一个OSVERSIONINFO结构体,信息更多更直接。

0 0
原创粉丝点击