回答
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
有一個清單查看器工具可用here - 我不知道作者是否會提供源代碼。
您可以提取/替換/合併/使用命令行工具清單,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
在編譯的應用程序來查看/編輯清單的最簡單方法是使用資源調諧器: http://www.restuner.com/tour-manifest.htm
在某些情況下,它比MS中的mt.exe更健壯,它是一個可視化工具。
資源調諧器會很好,如果它支持x64代碼,但截至今天,它仍然只適用於32位應用程序。 Resource Hacker(最新的公開測試版)確實支持x86和x64,可以從這裏獲得: http://angusj.com/resourcehacker/
從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);
修復此問題從項目中刪除了開發商許可證(*_TemporaryKey.pfx
)或改變.PFX的名稱。
在記事本中打開文件。事情是純文本的。
作爲一個邊提醒:請記住,艙單也可以使用相同的名稱作爲獨立的應用程序文件(由「.manifest的」擴展)。
因此,如果您想查看哪些清單在運行時真正使用,必須將其考慮在內。
- 1. WPF應用程序清單文件
- 2. 提取安裝的應用程序的清單文件
- 3. 使用Java讀取.jar清單文件
- 4. 安裝前從應用程序中提取清單文件
- 5. Java多線程應用程序讀取單個文件
- 6. 螞蟻的build.xml清單文件讀取
- 7. 讀取.acf /清單文件中的值
- 8. 讀取文件的簡單javascript程序
- 9. 從應用程序支持文件夾中刪除文件後,應用程序正在讀取數據
- 10. 單個應用程序的兩個清單文件?
- 11. Java清單文件中的類路徑讀取不正確
- 12. 讀取文件而發佈一次單擊應用程序C#
- 13. Azure AD代理應用程序的應用程序清單文件
- 14. 從Powershell讀取XML文件/清單
- 15. 清單web應用程序
- 16. 清單Rails應用程序
- 17. HTML5離線「應用程序緩存錯誤事件:清單讀取失敗(-1)」
- 18. 用戶配置文件與色器件,清單應用程序
- 19. 清單文件在.NET應用程序中如何工作?
- 20. 如何在清單文件中註冊應用程序類?
- 21. 適用於Launcher和LockScreen應用程序的清單文件
- 22. 在.jar應用程序中讀取文本文件
- 23. 在android應用程序中逐行讀取文本文件
- 24. 在Android應用程序中讀取大型10mb文本文件
- 25. Singleton在Java Web應用程序中讀取屬性文件;正確的做法?
- 26. 如何在Android上的應用程序中讀取文件?
- 27. 在android中讀取你自己的應用程序文件?
- 28. 在iphone應用程序中讀取文件的問題!
- 29. 在基於Adobe Flex的應用程序中讀取Tiff文件
- 30. 獲取java.lang.NullPointerException讀取大小的應用程序文件夾
這有點不正確(幫助誤導)。通常,.exes在資源#1中具有嵌入式清單,而.dll在資源#2中具有清單。無論如何,如果您在#1中找不到清單資源,請選中#2而不是假定它不存在。 – Wedge 2009-08-29 17:05:31
在同一代碼中應該是argv [1]。 – pascal 2013-02-13 14:54:01
其實我是故意從當前應用程序中讀取清單:「提取自己清單的簡單示例」。你的方式也會奏效;-) – 2013-02-13 15:09:50