2014-09-23 2 views
0

최근에 (advapi32.dll에서) RegSetValueEx 문제가 발생했습니다. 레지스트리 키 .GetValue()를 사용하여 .Net 3.5에서 해당 메서드로 저장된 REG_SZ가 .Net 4.5에서 잘못 읽힌 것 같습니다. 아래 그림 :.Net 4.5 대. 닷넷 3.5 RegSetValueEx는 낱장 널 문자를 반환합니다.

//---.Net 3.5--- (no issues) 
Call RegSetValueEx() to save base64 string value "ajG8s" to the registry 
Call RegistryKey.GetValue() on that value returns "ajG8s" 

//---.Net 4.5--- (no issues) 
Call RegSetValueEx() to save base64 string value "ajG8s" to the registry 
Call RegistryKey.GetValue() on that value returns "ajG8s" 

//---.Net 3.5 & .Net 4.5--- (issues) 
Call RegSetValueEx() to save base64 string value "ajG8s" to the registry (in .Net 3.5) 
Call RegistryKey.GetValue() on that value returns "ajG8s\0\0\0\0\0\6\A\z./,'./Z?" (in .Net 4.5) 

코드는 100 % 동일합니다. 즉, .Net 4.5 버전을 전환하면됩니다.

원래 문자열에 레지스트리에 쓰여진 문자열이 제대로 null로 끝나지 않았다고 생각했습니다. 나는 또한 RegistryKey.SetValue() - RegSetValueEx (advapi32.dll) 만 사용하여 값을 쓰려고하면이 문제가 발생하는 것 같지 않은지 확인합니다.

이제 가장 간단한 해결 방법은 반환 된 문자열 (4.5에서)을 검색하여 첫 번째 null 종결 문자를 검색하고 나머지 문자열을 제거하는 것입니다. 그 해결책은 효과가 있지만 문제의 근원을 파악하고 싶습니다.

어떤 아이디어입니까? 많은 감사합니다!

+2

레지스트리에서보고있는 값을 표시하십시오으로 다른 사람을 돕고, 당신이 수행 한 모든 진단 * 정확히 * 당신은 .NET에서 검색하는지 결정하기 위해 - 현재 우리가 말할 수있는 것이 많지 않습니다. –

+0

문제가 무엇인지 정확히 알았으므로 이제는 더 나은 정보로 질문을 다시 작성했습니다. – Ross

+0

"base64 문자열 값 저장"의 의미는 100 % clera가 아닙니다. 문자열로 저장하고 있습니까? 바이트로 저장 하시겠습니까? 왜'RegSetValueEx'를 사용하고 있습니까? 레지스트리에 표시되는 내용은 무엇입니까? –

답변

0

실제 문제가 무엇인지 깨달았습니다. 실제 문제는 WinApi RegSetValueEx()를 사용하여 레지스트리에 base64 문자열을 잘못 작성했기 때문에 전달되었습니다. 전달 된 길이 속성이 너무 높아 결과적으로 가비지가 레지스트리에 기록되었습니다. NET 3.5과 4.5 사이

RegistryKey.GetValue() 

:

실제 문제

때문에 IN (가정) 변경 나타났다. .Net 3.5가 첫 번째 '\ 0'문자에서 GetValue()를 끝내면 .Net 4.5 GetValue()는 몇 가지 점까지 읽을 수 있습니다. 그 이유는 내가 '비난'했기 때문입니다. 그것은 비난하는 우리의 코드입니다! 여전히 노드에 대한 흥미로운 변화.

는 희망이 비슷한 문제 :

+0

대답이 왜 내려 갔는지 잘 모르겠습니다. 사실, 문제가 귀하의 코드에있었습니다. 그러나 귀하의 대답은 .NET 3.5와 .NET 4.5 사이의 호환성 문제를 잘 알고 있습니다. – davidbak

+0

나는 그렇게 잘 생각했다! 오 잘. :( – Ross