레지스트리를 통해 일부 프로그램 버전을 가져 오려고합니다. 내 코드는 릴리스 구성으로 설정하면 잘 작동합니다. 디버그 모드에서 실행하려고하면 "Run-Time Check Failure # 2 - 변수 '버전 주위의 스택'이 손상되었습니다."라는 메시지와 함께이 함수를 떠날 때 코드가 충돌합니다.디버그 구성에만 손상된 스택 C++
내 기능의 관련 코드 만 붙여 넣습니다. 그것은 내 코드에서 "버전"으로 나타나는 것입니다. 디버깅 할 때 버전이 적절한 값을 얻습니다. 릴리스 구성에서 코드가 충돌하지 않습니다. 두 구성 모두에 대해 "다중 바이트 문자 세트 사용"을 설정합니다.
TCHAR version[20];
DWORD dwBufferSize = 0;
if (RegQueryValueEx(hAppKey, "DisplayVersion", NULL,&dwType, (unsigned char*)version, &dwBufferSize) == ERROR_SUCCESS)
{
dwBufferSize = 20;
std::string vers(version, dwBufferSize);
return vers;
}
어떤 아이디어로 해결할 수 있습니까?
물론 모든 코드가 아닙니다. 그것은 20으로 설정됩니다. 그렇지 않으면 릴리스 구성에서 작동하지 않습니다. –
@ IggyBrodevíć : 그렇다면 관련 코드를 충분히 표시하지 않았습니다. 그것이 의미하는 것처럼'DWORD dwBufferSize = 0;'에 이어'RegQueryValueEx'가 단지 명백한 잘못입니다. 당신이 실제로 그것을하고 그것을 릴리스에서 실행하는 경우 실제로 옳은 일을하고있는 것처럼 보일 수 있습니다. 그것이 코드가하는 것이 아니라면 실제 문제를 나타내는 코드를 제시해야합니다. –
더 많은 관련 코드를 보지 않아도됩니다. 당신의 문제에 대한 나의 가장 좋은 추측은 이것입니다. 실제 코드에서는 dwBufferSize를 sizeof (버전)보다 큰 값으로 설정합니다. MCHS로 빌드한다고해도 TCHAR는 1 또는 2 바이트가 될 수 있으므로 sizeof()를 사용합니다. 스택 손상으로 인해 'version' 버퍼를 채우고 스택이 손상되었는지 탐지하는 데 사용 된 가드 비트를 지 웠습니다.다른 가능성은 버퍼를 덮어 쓴'version'을 다루는 다른 코드를 빠뜨린 것입니다. 임의의 최대 아웃 버퍼의 끝 부분에 널 문자 (\ 0)를 추가 했습니까? –