2009-01-07 58 views

回答

36

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 
+7

這有點不正確(幫助誤導)。通常,.exes在資源#1中具有嵌入式清單,而.dll在資源#2中具有清單。無論如何,如果您在#1中找不到清單資源,請選中#2而不是假定它不存在。 – Wedge 2009-08-29 17:05:31

+0

在同一代碼中應該是argv [1]。 – pascal 2013-02-13 14:54:01

+0

其實我是故意從當前應用程序中讀取清單:「提取自己清單的簡單示例」。你的方式也會奏效;-) – 2013-02-13 15:09:50

9

有一個清單查看器工具可用here - 我不知道作者是否會提供源代碼。

24

您可以提取/替換/合併/使用命令行工具清單,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文件\微軟的SDK \的Windows \ V6.1 \ BIN

4

資源調諧器會很好,如果它支持x64代碼,但截至今天,它仍然只適用於32位應用程序。 Resource Hacker(最新的公開測試版)確實支持x86和x64,可以從這裏獲得: http://angusj.com/resourcehacker/

1

從Roger的代碼中工作一下,這裏是我使用的代碼。它假定Manifest在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); 
0

修復此問題從項目中刪除了開發商許可證(*_TemporaryKey.pfx)或改變.PFX的名稱。

16

在記事本中打開文件。事情是純文本的。

Screen grab

0

作爲一個邊提醒:請記住,艙單也可以使用相同的名稱作爲獨立的應用程序文件(由「.manifest的」擴展)。

因此,如果您想查看哪些清單在運行時真正使用,必須將其考慮在內。

相關問題