чтение файла манифеста приложения? - PullRequest
34 голосов
/ 07 января 2009

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

Я размышлял по линии альтернативного потока данных?

Ответы [ 9 ]

39 голосов
/ 07 января 2009

Файлы манифеста 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
27 голосов
/ 08 января 2009

Вы можете извлечь / заменить / объединить / проверить манифесты, используя инструмент манифеста командной строки, 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 SDKs \ Windows \ v6.1 \ bin

19 голосов
/ 27 декабря 2013

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

Screen grab

10 голосов
/ 07 января 2009

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

4 голосов
/ 16 июня 2010

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

2 голосов
/ 25 января 2009

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

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

1 голос
/ 13 декабря 2011

Работая немного из кода Роджера, вот код, который я использую. Предполагается, что Манифест находится под номером 1. Я думаю, это по умолчанию для .exe. Смотрите комментарий от Wedge, возможно, вам также придется проверить id # 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);
0 голосов
/ 10 октября 2016

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

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

0 голосов
/ 28 января 2013

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

...