windows 注册表编程

例子:将本地计算机的Monitor ID写入到注册表中

 (1)获取MonitorID

   

BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID * InterfaceClassGuid) { WriteEventLogEntry(L"EnumClassDevice ", EVENTLOG_ERROR_TYPE); HDEVINFO DeviceInfoSet; HDEVINFO NewDeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData; ZeroMemory(&DeviceInfoData, sizeof(DeviceInfoData)); DeviceInfoData.cbSize = sizeof(DeviceInfoData); DeviceInfoData.DevInst = 0; DeviceInfoData.ClassGuid = *InterfaceClassGuid; DeviceInfoData.Reserved = 0; DWORD i; // 创建空设备信息列表 

    DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL); BOOLEAN ret = FALSE; if (DeviceInfoSet == INVALID_HANDLE_VALUE) { writeErrorLog(L"CreateDeviceInfoList failed: ", GetLastError()); return ret; } // 根据接口类型获得新的设备信息列表 

 NewDeviceInfoSet = SetupDiGetClassDevsEx( InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE, DeviceInfoSet,// 之前创建的设备信息列表 

 NULL, NULL ); if (NewDeviceInfoSet == INVALID_HANDLE_VALUE) { writeErrorLog(L"SetupDiGetClassDevsEx failed: ", GetLastError()); return ret; } for (i = 0;; i++) { BOOL bResult = SetupDiEnumDeviceInfo(NewDeviceInfoSet, i, &DeviceInfoData); if (!bResult) { if (GetLastError() != NO_ERROR &&GetLastError() != ERROR_NO_MORE_ITEMS) { writeErrorLog(L"SetupDiEnumDeviceInfo ERROR ", GetLastError()); return ret; } break; } else { char DeviceID[MAX_DEV_LEN]; bool resHardwareID = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, 0, (PBYTE)DeviceID, MAX_DEV_LEN, NULL); if (!resHardwareID) { ZeroMemory(&DeviceID, sizeof(DeviceID)); } else{ //写入注册表,并break;

 setRegKey(DeviceID, name_monitor); } } } SetupDiDestroyDeviceInfoList(DeviceInfoSet); return TRUE; }

 

 (2)将MonitorID写入到注册表

LPCTSTR SubKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

void setRegKey(char* value, LPCWSTR name){

    //将Ansi字符串转换成Unicode字符串

	LPWSTR pwszOut = NULL;// Typedef WCHAR* LPWSTR

	if (value != NULL)

	{

		// Double NULL Termination

		int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, value, -1, NULL, 0);//获取字符的长度

		pwszOut = new TCHAR[nOutputStrLen]; 



		memset(pwszOut, 0, nOutputStrLen);

		MultiByteToWideChar(CP_ACP, 0, value, -1, pwszOut, nOutputStrLen);

	}



	HKEY key = NULL;

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS){//打开注册表项

		writeDebugEventLog(L"[Service]   RegOpenKeyEx  ok ", EVENTLOG_INFORMATION_TYPE);

		if (RegSetValueEx(key, name, 0, REG_SZ, (unsigned const char*)pwszOut, sizeof(TCHAR)*(lstrlenW(pwszOut) + 1)) == ERROR_SUCCESS){

			writeDebugEventLog(L"[Service]   setRegKey  ok ", EVENTLOG_INFORMATION_TYPE);

		}

		else{

			writeErrorLog(L"[Service]   RegSetValueEx    ", GetLastError());

		}

	}

	else {

		writeErrorLog(L"[Service]   RegOpenKeyEx     ", GetLastError());

	}

	if (key != NULL)	RegCloseKey(key);



	if (pwszOut != NULL) delete[] pwszOut;

}

  

 

 (3)从注册表中读取MonitorID

void readRegKey(LPCWSTR name,LPWSTR id){

	HKEY key;

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, &key) == ERROR_SUCCESS){



		DWORD nType, nLen;

		WCHAR buff[MAX_DEV_LEN]; 

		RegQueryValueEx(key, name, 0, &nType, (LPBYTE)buff, &nLen);

		writeDebugEventLog(L"[MonitorHelp]   readRegKey  RegQueryValueEx ok ", EVENTLOG_INFORMATION_TYPE);

		RegCloseKey(key);

		lstrcpyW(id,buff);

	}

	else{

		printf("readRegKey    RegOpenKeyEx fail");

		writeDebugEventLog(L"[MonitorHelp]   readRegKey  RegQueryValueEx fail ", EVENTLOG_INFORMATION_TYPE);

	}

}

  

 

你可能感兴趣的:(windows)