我希望能够检测“HKEY_LOCAL_MACHINE\SOFTWARE\blah\SetupPath”开头的注册表键,并且如果可能的话,将其读取至一个CString中。我查看了 RegOpenKeyEx 函数的 MSDN 页面。
现在我可以调用它。
LONG WINAPI RegOpenKeyEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_Reserved_ DWORD ulOptions,
_In_ REGSAM samDesired,
_Out_ PHKEY phkResult
);
所以对于这个问题,看起来我需要设置一些东西。
HKEY hKey = HKEY_LOCAL_MACHINE;
LPCTSTR lpSubKey = "SOFTWARE\blah\SetupPath";
要检查键是否存在,只需执行以下操作:
LONG res = RegOpenKeyEx(hKey, lpSubKey, 0, 0, 0);
if(res == ERROR_SUCCESS)
// The key exists
如果键存在,我想将其读入到一个CString中。我还看到了RegQueryValueEx。
LONG WINAPI RegQueryValueEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpValueName,
_Reserved_ LPDWORD lpReserved,
_Out_opt_ LPDWORD lpType,
_Out_opt_ LPBYTE lpData,
_Inout_opt_ LPDWORD lpcbData
);
看起来在调用这个函数之前,我需要进行一些设置。
HKEY hKey = HKEY_LOCAL_MACHINE;
lpSubKey = "SOFTWARE\blah\SetupPath";
LPDWORD type = null;
LPDWORD data = null;
现在我可以调用它。
LONG res2 = RegValueQueryEX(hKey, lpSubKey, 0, type, data,0);
那么我认为可以先检查类型,然后转换为字符串吗?
CString regVal;
if(res2 == ERROR_SUCCESS)
if(type == REG_SZ)
if(data != null)
regVal = new CString((LPSTR)data);
这一切都正确吗?我可能会错过什么或需要做什么吗?
CString
的GetBuffer
/ReleaseBuffer
机制。这种模式符合典型的 Win32 使用方式;您获得一个固定大小的缓冲区,调用 API,并将使用了多少缓冲区的信息返回给CString
。 - MSaltersRegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\blah", 0, KEY_READ, &key);
如果我使用0
而不是KEY_READ
,那么 key 将为 NULL。 - Valentin Safonnikov