читаете файл манифеста приложения?

Есть ли простой способ прочитать уже встроенный файл манифеста приложения?

Я думал об альтернативном потоке данных?


person Brian R. Bondy    schedule 07.01.2009    source источник


Ответы (9)


Файлы манифеста 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
person Roger Lipscombe    schedule 07.01.2009
comment
Это несколько неверно (справка вводит в заблуждение). Обычно .exes имеют встроенный манифест в ресурсе №1, а .dll - манифест в ресурсе №2. В любом случае, если вы не нашли ресурс манифеста в №1, проверьте №2, а не предполагайте, что он не существует. - person Wedge; 29.08.2009
comment
На самом деле я намеренно читал манифест текущего приложения: простой пример, извлекающий собственный манифест. Ваш способ тоже подойдет ;-) - person Roger Lipscombe; 13.02.2013
comment
Оба UnlockResource и FreeResource устарели. - person ghord; 20.01.2016
comment
Программирую Windows с 3.0; Старые привычки умирают с трудом :) - person Roger Lipscombe; 20.01.2016

Вы можете извлекать / заменять / объединять / проверять манифесты с помощью инструмента манифеста командной строки 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

Разные локации:

  • C: \ Program Files \ Microsoft SDK \ Windows \ v6.1 \ bin
  • C: \ Program Files (x86) \ Комплекты Windows \ 10 \ bin \ 10.0.18362.0 \ x86
person bk1e    schedule 08.01.2009
comment
-out:con для вывода на консоль :) - person Martin Connell; 25.05.2017
comment
Это приводит к ошибке для меня с Microsoft Visual Studion 2019: mt.exe: ошибка командной строки c10100a9: должна быть указана некоторая операция с входными манифестами (даже если это просто перенаправить вход на выход) - person mzabaluev; 15.02.2020
comment
Ответ на себя: я запустил эту командную строку в PowerShell, и она требует некоторого экранирования для синтаксиса, используемого в параметре inputresource, например: mt.exe "-inputresource:dll_with_manifest.dll;#1" -out:extracted.manifest - person mzabaluev; 16.02.2020

Откройте файл в Блокноте. Дело в простом тексте.

Снимок экрана

person guest    schedule 27.12.2013
comment
lol, это также работает в Linux или BSD с командой 'less'. Благодарность - person don bright; 05.10.2016
comment
Это очень полезный трюк, позволяющий быстро проверить, что там находится. Спасибо - person StayOnTarget; 29.06.2017

Инструмент просмотра манифеста доступен здесь - Я не знаю, сделает ли автор доступным исходный код.

person jeffm    schedule 07.01.2009

Resource Tuner было бы неплохо, если бы он поддерживал код x64, но на сегодняшний день он по-прежнему только для 32-битных приложений. Resource Hacker (новейшая общедоступная бета-версия) поддерживает как x86, так и x64, которые доступны здесь: http://angusj.com/resourcehacker/

person Community    schedule 16.06.2010

Самый простой способ просматривать / редактировать манифесты в скомпилированных приложениях - использовать Resource Tuner: http://www.restuner.com/tour-manifest.htm

В некоторых случаях он более надежен, чем mt.exe от MS, и представляет собой визуальный инструмент.

person Wylder    schedule 25.01.2009

Немного поработав с кодом Роджера, вот код, который я использую. Предполагается, что манифест находится по идентификатору # 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);
person Samphan    schedule 13.12.2011

Устраните эту проблему, удалив лицензию разработчика (*_TemporaryKey.pfx) из проекта или изменив имя .pfx.

person Rahul Tripathi    schedule 28.01.2013

В качестве напоминания: помните, что манифесты также могут быть отдельными файлами с тем же именем, что и приложение (с расширением ".manifest").

Поэтому, если вы хотите проверить, какой манифест действительно используется во время выполнения, это необходимо принять во внимание.

person chksr    schedule 10.10.2016