Есть ли простой способ прочитать уже встроенный файл манифеста приложения?
Я думал об альтернативном потоке данных?
Есть ли простой способ прочитать уже встроенный файл манифеста приложения?
Я думал об альтернативном потоке данных?
Файлы манифеста Windows - это ресурсы Win32. Другими словами, они встроены в конец EXE или DLL. Вы можете использовать LoadLibraryEx, FindResource, LoadResource и LockResource для загрузки встроенного ресурса.
Вот простой пример, который извлекает собственный манифест ...
BOOL CALLBACK EnumResourceNameCallback(HMODULE hModule, LPCTSTR lpType,
LPWSTR lpName, LONG_PTR lParam)
{
HRSRC hResInfo = FindResource(hModule, lpName, lpType);
DWORD cbResource = SizeofResource(hModule, hResInfo);
HGLOBAL hResData = LoadResource(hModule, hResInfo);
const BYTE *pResource = (const BYTE *)LockResource(hResData);
TCHAR filename[MAX_PATH];
if (IS_INTRESOURCE(lpName))
_stprintf_s(filename, _T("#%d.manifest"), lpName);
else
_stprintf_s(filename, _T("%s.manifest"), lpName);
FILE *f = _tfopen(filename, _T("wb"));
fwrite(pResource, cbResource, 1, f);
fclose(f);
UnlockResource(hResData);
FreeResource(hResData);
return TRUE; // Keep going
}
int _tmain(int argc, _TCHAR* argv[])
{
const TCHAR *pszFileName = argv[0];
HMODULE hModule = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
EnumResourceNames(hModule, RT_MANIFEST, EnumResourceNameCallback, NULL);
FreeLibrary(hModule);
return 0;
}
В качестве альтернативы вы можете использовать MT.EXE из Windows SDK:
>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
Вы можете извлекать / заменять / объединять / проверять манифесты с помощью инструмента манифеста командной строки mt.exe, который является частью Windows SDK:
C:\Program Files\Microsoft SDKs\Windows\v6.1>mt /?
Microsoft (R) Manifest Tool version 5.2.3790.2075
...
> To extract manifest out of a dll:
mt.exe -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
Разные локации:
-out:con для вывода на консоль :)
- person Martin Connell; 25.05.2017
inputresource, например: mt.exe "-inputresource:dll_with_manifest.dll;#1" -out:extracted.manifest
- person mzabaluev; 16.02.2020
Откройте файл в Блокноте. Дело в простом тексте.

Инструмент просмотра манифеста доступен здесь - Я не знаю, сделает ли автор доступным исходный код.
Resource Tuner было бы неплохо, если бы он поддерживал код x64, но на сегодняшний день он по-прежнему только для 32-битных приложений. Resource Hacker (новейшая общедоступная бета-версия) поддерживает как x86, так и x64, которые доступны здесь: http://angusj.com/resourcehacker/
Самый простой способ просматривать / редактировать манифесты в скомпилированных приложениях - использовать Resource Tuner: http://www.restuner.com/tour-manifest.htm
В некоторых случаях он более надежен, чем mt.exe от MS, и представляет собой визуальный инструмент.
Немного поработав с кодом Роджера, вот код, который я использую. Предполагается, что манифест находится по идентификатору # 1. Я думаю, это значение по умолчанию для .exe. См. Комментарий Wedge. Возможно, вам также придется проверить идентификатор №2, если вы работаете с DLL.
HMODULE module = ::LoadLibraryEx(pathname, NULL, LOAD_LIBRARY_AS_DATAFILE);
if (module == NULL)
return false;
HRSRC resInfo = ::FindResource(module, MAKEINTRESOURCE(1), RT_MANIFEST); // resource id #1 should be the manifest
if (resInfo) {
HGLOBAL resData = ::LoadResource(module, resInfo);
DWORD resSize = ::SizeofResource(module, resInfo);
if (resData && resSize) {
const char *res = (const char *)::LockResource(resData); // the manifest
if (res) {
// got the manifest
}
::UnlockResource(resData);
}
::FreeResource(resData);
}
::FreeLibrary(module);
Устраните эту проблему, удалив лицензию разработчика (*_TemporaryKey.pfx) из проекта или изменив имя .pfx.
В качестве напоминания: помните, что манифесты также могут быть отдельными файлами с тем же именем, что и приложение (с расширением ".manifest").
Поэтому, если вы хотите проверить, какой манифест действительно используется во время выполнения, это необходимо принять во внимание.