내 순수 영어로 죄송합니다.버퍼가 이미 충분히 큰 경우 RegQueryValueEx가 ERROR_MORE_DATA를 반환합니다.
동일한 값으로 데이터를 읽고 쓸 수있는 두 개의 프로세스가 있습니다 (테스트에서 수행). 때때로 (10 회에 1 회) read 메소드가 ERROR_MORE_DATA 오류이고 값이 12 인 경우 실패합니다. 그러나 32 바이트 테스트에서 Read 메소드를 호출합니다.
우연히 watch (GetLastError())에서 @ err, hr을보고 ERROR_NOT_OWNER 오류 코드를 보았습니다. 두 번째 프로세스가 키를 차단하고 다시 시도해야한다는 것을 알고 있습니다.
누구나 내 결론을 승인 할 수 있습니까 (MSDN은 이것에 대해 아무 말도하지 않습니다)? 누구나 다른 이상한 효과를 말할 수 있습니까?
감사합니다.
업데이트 : 나는 UAC 가상화를 보유하고 있습니다. 모든 변경 사항은 에 저장됩니다. [HKEY_CLASSES_ROOT \ VirtualStore \ MACHINE \ SOFTWARE] 효과 가상화 일 수 있습니까 ???
{
...
char name[32] = "";
grandchild.OpenValue("name").Read(name, _countof(name));
...
}
bool RegisteryStorageValue::Read(void* Buffer, size_t Size) throw (IOException)
{
DWORD Value = DWORD(Size);
DWORD rez = ::RegQueryValueEx(mKey, mName.c_str(), NULL, NULL, (BYTE*)Buffer, &Value);
if (rez != ERROR_SUCCESS) // here I have 'rez = ERROR_MORE_DATA' and 'Value = 12'
throw IOException(rez);
return true;
}
bool RegisteryStorageValue::Write(Type type, const void* Buffer, size_t Size) throw (IOException)
{
DWORD rez = ::RegSetValueEx(mKey, mName.c_str(), NULL, getRegType(type), (const BYTE*)Buffer, (DWORD)Size);
if (rez != ERROR_SUCCESS)
throw IOException(rez);
return true;
}
감사합니다. GetLastError()는 실제로 다른 코드에 의해 저장됩니다. 그러나 코드를 수정하여 입력 매개 변수를 기억하고 with 출력을 dispay합니다. 그리고 그들은 여전히 동일합니다 : – diman
쿼리하기 전에 : \t 크기 : 쿼리 후 32 : \t 필수 크기 : 12 \t 결과 : 234 – diman
당신이 정상적인 조건에서 가능하지 않아야 설명, 그래서 당신이 의심해야 정상적인 상황이 아닙니다. 비 Windows PC에서 가상화 된 환경 (VirtualPC, VMWare, Wine 등)에서 앱을 실행하고 있습니까? 뭔가가'RegQueryValueEx()'에 연결되어 정상 동작을 변경합니다. UAC만으로는 그렇게하지 않을 것입니다. –