我真的陷入困境...我有一个 Windows 程序,我试图简单地向注册表写入一个值。
问题是
RegCreateKeyEx()
返回 5 (ERROR_ACCESS_DENIED
)。
我的登录用户名属于本地管理员组。
lpdwDisposition
中的RegCreateKeyEx()
参数设置为2 (REG_OPENED_EXISTING_KEY
),但RegCreateKeyEx()
仍然返回ERROR_ACCESS_DENIED
。
这是一个 32 位程序,所以我将 SAM 设置为
KEY_WOW64_32KEY | KEY_WRITE
这是最小的工作示例代码:
#include <Windows.h>
#include <time.h>
#include <strsafe.h>
void GetCurrentDateAndTimeWithMs(WCHAR *sValueData, DWORD dwSizeValueData)
{
CONST INT iSize = 64;
WCHAR sDate[iSize] = {0};
WCHAR sTime[iSize] = {0};
SYSTEMTIME lt = {0};
GetLocalTime(<);
GetDateFormat(LOCALE_USER_DEFAULT, NULL, <, NULL, sDate, iSize);
GetTimeFormat(LOCALE_USER_DEFAULT, NULL, <, NULL, sTime, iSize);
StringCchPrintf(sValueData, dwSizeValueData, L"%s %s.%u",sDate, sTime, lt.wMilliseconds);
}
DWORD SaveToRegistry(CONST WCHAR *sPath, CONST WCHAR *sValueName, CONST WCHAR *sValueData)
{
LSTATUS dwRV = 0;
HKEY hKey = NULL;
DWORD rv = 0;
DWORD dwType_Local = REG_SZ;
dwRV = RegCreateKeyExW(HKEY_LOCAL_MACHINE, sPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WOW64_32KEY | KEY_WRITE, NULL, &hKey, &rv);
if (dwRV == ERROR_SUCCESS)
{
DWORD dwLenData = (DWORD) wcslen(sValueData) +1;
dwRV = RegSetValueExW(hKey, sValueName, 0, dwType_Local, (LPBYTE) sValueData, dwLenData * sizeof(WCHAR));
}
RegCloseKey(hKey);
return dwRV;
}
int main()
{
WCHAR sDT[64] = {0};
GetCurrentDateAndTimeWithMs(sDT, 64);
SaveToRegistry(L"Software\\Company\\Product\\Settings", L"CurrentDateTime", sDT);
}
出乎意料的答案,但创建密钥的方法实际上对我有用。谢谢你。