|
|
本帖最后由 Zap 于 2025-11-7 13:04 编辑
呼叫古希腊掌管代码的神- //返回程序第一个图标名
- #include <windows.h>
- #include <shlwapi.h>
- #include <wchar.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <io.h> // 用于_setmode
- #include <fcntl.h> // 用于_O_U16TEXT
- #pragma comment(lib, "shlwapi.lib")
- // 全局资源名称数组及计数
- wchar_t** g_resourceNames = NULL;
- int g_resourceCount = 0;
- // 资源枚举回调函数:正确处理整数ID和字符串名称
- BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCWSTR lpszType, LPWSTR lpszName, LONG_PTR lParam) {
- wchar_t* resName = NULL;
- if (IS_INTRESOURCE(lpszName)) {
- // 处理整数ID(资源ID是16位无符号整数)
- WORD id = (WORD)(UINT_PTR)lpszName; // 正确转换资源ID
- resName = (wchar_t*)malloc(64 * sizeof(wchar_t)); // 扩大缓冲区避免溢出
- if (!resName) return FALSE; // 检查内存分配失败
- // 格式化整数ID为 "#数字"(例如#1000)
- if (swprintf_s(resName, 64, L"#%u", id) < 0) { // 使用%u匹配WORD(无符号)
- free(resName);
- return FALSE;
- }
- } else {
- // 处理字符串名称(例如ICO_MYCOMPUTER)
- size_t nameLen = wcslen(lpszName);
- resName = (wchar_t*)malloc((nameLen + 1) * sizeof(wchar_t));
- if (!resName) return FALSE; // 检查内存分配失败
- wcscpy_s(resName, nameLen + 1, lpszName);
- }
- // 扩展资源名称数组
- wchar_t** newArray = (wchar_t**)realloc(g_resourceNames, (g_resourceCount + 1) * sizeof(wchar_t*));
- if (!newArray) {
- free(resName);
- return FALSE;
- }
- g_resourceNames = newArray;
- g_resourceNames[g_resourceCount++] = resName;
- return TRUE;
- }
- // 释放资源名称数组内存
- void FreeResourceNames() {
- for (int i = 0; i < g_resourceCount; i++) {
- if (g_resourceNames[i]) free(g_resourceNames[i]);
- }
- free(g_resourceNames);
- g_resourceNames = NULL;
- g_resourceCount = 0;
- }
- // 显示帮助信息
- void ShowHelp(const wchar_t* programName) {
- wprintf(L"用法: %ls <目标程序路径>\n", programName);
- wprintf(L"示例: %ls C:\\Windows\\explorer.exe\n", programName);
- }
- int wmain(int argc, wchar_t* argv[]) {
- // 设置控制台宽字符模式(确保中文和宽字符正常显示)
- _setmode(_fileno(stdout), _O_U16TEXT);
- _setmode(_fileno(stderr), _O_U16TEXT);
- // 参数检查
- if (argc != 2) {
- ShowHelp(argv[0]);
- return -1;
- }
- wchar_t targetPath[MAX_PATH];
- wcscpy_s(targetPath, MAX_PATH, argv[1]);
- // 检查目标文件是否存在
- if (!PathFileExistsW(targetPath)) {
- fwprintf(stderr, L"错误: 文件不存在 - %ls\n", argv[1]);
- return -2;
- }
- // 加载目标程序作为资源文件(仅读取资源,不执行代码)
- HMODULE hModule = LoadLibraryExW(targetPath, NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
- if (!hModule) {
- fwprintf(stderr, L"错误: 无法加载文件资源 (错误码: %d)\n", GetLastError());
- return -3;
- }
- // 枚举所有图标组资源(RT_GROUP_ICON是图标组的资源类型)
- FreeResourceNames();
- if (!EnumResourceNamesW(hModule, RT_GROUP_ICON, EnumResNameProc, 0)) {
- fwprintf(stderr, L"错误: 枚举图标资源失败 (错误码: %d)\n", GetLastError());
- FreeLibrary(hModule);
- FreeResourceNames();
- return -3;
- }
- // 输出第一个图标组名称(修复格式符错误)
- if (g_resourceCount > 0 && g_resourceNames[0]) {
- // 修复:用%ls打印宽字符字符串(wchar_t*),而非%s
- wprintf(L"%ls\n", g_resourceNames[0]);
- } else {
- fwprintf(stderr, L"错误: 未找到图标组资源\n");
- FreeLibrary(hModule);
- FreeResourceNames();
- return -3;
- }
- // 清理资源
- FreeLibrary(hModule);
- FreeResourceNames();
- return 0;
- }
复制代码 |
|