Я тестирую функции GetFileVersionInfo и VerQueryValue, чтобы получить исходное имя файла (OriginalFilename) файла в Windows 10 (64 бит, версия 1803).
Я мог бы получить оригинальное имя файла некоторых приложений, таких как cmd.exe, putty.exe.
Моя проблема в том, что если я применяю эти функции к windowsapp, функция VerQueryValue никогда не возвращается.
Одним из протестированных приложений является калькулятор (calculator.exe), который находится в папке «C: \ Program Files \ WindowsApps \ Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe \ Calculator.exe».
После изменения параметров безопасности каталога был тот же результат.
Результаты были такими же, даже при копировании Calculator.exe в Windowsapp в другой каталог (e: \ aa \ Calculator.exe).
Вот мой код:
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
VOID readFileInfo(LPWSTR fullName, LPWSTR infoStr)
{
DWORD dwHandle;
wprintf(L"read info from %s\n", fullName);
DWORD dwinfoSize = GetFileVersionInfoSize(fullName, &dwHandle);
if (!dwinfoSize) return;
LPWSTR info = (LPWSTR)calloc(1, dwinfoSize);
printf("info size: %u\n", dwinfoSize);
if (info) {
BOOL bRes = GetFileVersionInfo(fullName, 0, dwinfoSize, info);
if (bRes) {
UINT uLen;
UINT uBytes;
LPBYTE lpBuffer = NULL;
if (VerQueryValue(info, L"\\VarFileInfo\\Translation", (LPVOID *)&lpTranslate, &uLen)) {
if (uLen) {
WCHAR buf[1024] = { 0 };
swprintf(buf, L"\\StringFileInfo\\%04x%04x\\%s", lpTranslate[0].wLanguage, lpTranslate[0].wCodePage, infoStr);
wprintf(L"VerQueryValue Len: %d\n", uLen);
VerQueryValue(info, buf, (LPVOID*)&lpBuffer, &uBytes); //never return !!!!!!!!!!!!!!
wprintf(L"%s is %s\n", infoStr, (LPWSTR)lpBuffer);
}
}
}
free(info);
info = NULL;
}
}
int main()
{
//ok(can get origianl filename)
readFileInfo(L"C:\\Windows\\System32\\cmd.exe", L"OriginalFilename");
//not ok(second VerQueryValue never retrun)
readFileInfo(L"C:\\Program Files\\WindowsApps\\Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe\\Calculator.exe", L"OriginalFilename");
//not ok
readFileInfo(L"E:\\aa\\Calculator.exe", L"OriginalFilename");
return 0;
}
пожалуйста, проверьте, в чем проблема ..
Благодарю.
Задача ещё не решена.
Других решений пока нет …