Проблема при получении исходного имени файла приложения для Windows с помощью GetFileVersionInfo и VerQueryValue API

Я тестирую функции 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;
}

пожалуйста, проверьте, в чем проблема ..
Благодарю.

Следующий файл этот файл ….
введите описание изображения здесь

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]