web-dev-qa-db-ja.com

アプリケーションのマニフェストファイルを読み取りますか?

アプリケーションに既に埋め込まれているマニフェストファイルを読み取る簡単な方法はありますか?

代替のデータストリームに沿って考えていましたか?

35
Brian R. Bondy

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;
}

または、Windows SDKのMT.EXEを使用することもできます。

>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
39
Roger Lipscombe

Windows SDKの一部であるコマンドラインマニフェストツールmt.exeを使用して、マニフェストを抽出/置換/マージ/検証できます。

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にツールを見つけました

30
bk1e

ファイルをメモ帳で開きます。プレーンテキストです。

Screen grab

23
guest

利用可能なマニフェストビューアツールがあります ここ -作成者がソースコードを利用できるようにするかどうかはわかりません。

10
jeffm

リソースチューナーは、x64コードをサポートしていればいいのですが、現在のところ、32ビットアプリ専用です。 Resource Hacker(最新のパブリックベータ)は、x86とx64の両方をサポートしています。これは、こちらから入手できます。 http://angusj.com/resourcehacker/

4
Mike

コンパイル済みアプリのマニフェストを表示/編集する最も簡単な方法は、リソースチューナーを使用することです http://www.restuner.com/tour-manifest.htm

場合によっては、MSのmt.exeよりも堅牢で、視覚的なツールです。

2
Wylder

ロジャーのコードから少し作業すると、ここに私が使用するコードがあります。マニフェストがID#1にあると想定しています。これは.exeのデフォルトだと思います。 Wedgeのコメントを参照してください。DLLを使用している場合は、id#2も確認する必要があります。

    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);
1
Samphan

補足として:マニフェストは、アプリと同じ名前のスタンドアロンファイルにすることもできます(「.manifest」で拡張子が付けられます)。

したがって、実行時に実際に使用されているマニフェストを確認する場合は、これを考慮する必要があります。

0
chksr

この問題を解決するには、開発者ライセンス(*_TemporaryKey.pfx)プロジェクトから、または.pfxの名前を変更します。

0
Rahul Tripathi