我已使用VS2012 C++
項目從Win8
移至Win10
。我沒有問題,而在Win8中使用VerQueryValue
功能,但現在我調試過程中有錯誤:Windows10中的VerQueryValue
Unhandled exception at 0x77C88F11 (ntdll.dll) in MyApp.exe: 0xC0000005: Access violation writing location 0x00AAC2DC.
我使用示例代碼MSDN:
CString GetVersionInfo(HMODULE hLib, CString csEntry)
{
CString csRet;
if (hLib == NULL)
hLib = AfxGetResourceHandle();
HRSRC hVersion = FindResource(hLib,
MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
if (hVersion != NULL)
{
HGLOBAL hGlobal = LoadResource(hLib, hVersion);
if (hGlobal != NULL)
{
LPVOID versionInfo = LockResource(hGlobal);
if (versionInfo != NULL)
{
DWORD vLen,langD;
BOOL retVal;
LPVOID retbuf=NULL;
static char fileEntry[256];
sprintf(fileEntry,"\\VarFileInfo\\Translation");
retVal = VerQueryValue(versionInfo,fileEntry,&retbuf,(UINT *)&vLen);
if (retVal && vLen==4)
{
memcpy(&langD,retbuf,4);
sprintf(fileEntry, "\\StringFileInfo\\%02X%02X%02X%02X\\%s",
(langD & 0xff00)>>8,langD & 0xff,(langD & 0xff000000)>>24,
(langD & 0xff0000)>>16, csEntry);
}
else
sprintf(fileEntry, "\\StringFileInfo\\%04X04B0\\%s",
GetUserDefaultLangID(), csEntry);
if (VerQueryValue(versionInfo,fileEntry,&retbuf,(UINT *)&vLen))
csRet = (char*)retbuf;
}
}
UnlockResource(hGlobal);
FreeResource(hGlobal);
}
return csRet;
}
可能是什麼問題?
做一些調試。代碼中寫入的特定內存會導致異常。一邊。你爲什麼決定讓'fileEntry'靜態?你知道這意味着你的函數不是線程安全的嗎?通過使其變爲靜態可能會獲得什麼? 'VerQueryValue'中的 –
異常?或者在'CString csEntry'中使用'%s'時可能在'sprintf'中? – RbMm
顯示調用堆棧。顯示你如何調用'GetVersionInfo'。顯示[mcve]。 –