最近,我编写了一个程序,它加载可执行文件或 DLL 文件,枚举其中的所有图标资源,然后将每个图标资源作为 .ico 文件保存在文件夹中。但它使用直方图(如本文中讨论的)来避免保存重复的图标(看起来相同的图标)。
该程序首先从用户那里获取两条路径(用户必须在控制台窗口中输入它们)。其中之一是exe或dll文件的路径,另一个是保存.ico文件的文件夹的路径。
然后程序通过调用加载 exe 或 dll 文件,LoadLibraryEx并通过调用枚举图标资源EnumResourceNames。
传递的回调函数将EnumResourceNames每个非重复图标资源保存为具有唯一名称的 .ico 文件。保存的文件的名称如下:1.ico, 2.ico, 3.ico, 4.ico, .etc
问题是我的程序创建了损坏或未知的 .ico 文件,而不是真实的文件。我的意思是,一些保存的图标有奇怪的图像,其中一些根本不可见!尽管我BITMAPFILEHEADER使用函数将结构写入每个 .ico 文件WriteFile。
只需编译并运行我的代码,然后在控制台窗口中键入以下内容:
C:\Windows\System32\shell32.dll
Run Code Online (Sandbox Code Playgroud)
然后键入要保存 .ico 文件的现有文件夹的路径。
接下来,等待至少 4 到 7 秒,直至操作完成。
然后打开该文件夹,然后看到图标!他们可笑了!
以下是我的代码。抱歉,如果注释中或者变量和函数的名称中存在拼写错误。无论如何,只有函数main()和EnumIcons()才是重要的,并且一定要阅读代码下面的解释。
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <string>
#include <vector>
using namespace std;
string folderPath;
//Variables to store the number of …Run Code Online (Sandbox Code Playgroud) 您知道 - 在 C++ 中,您可以通过将 I/O 设备的路径作为调用 CreateFile 函数的第一个参数传递来获取 I/O 设备的句柄。但我想知道 CreateFile 如何通过给定的路径定位和识别设备。有一天,我使用 WinObj 实用程序发现了一些有关此主题的信息,这可能是真的。
在WinObj中,有一个名为Global??的目录 它位于根目录下,可以在左侧窗格中看到。该目录包含许多“SymbolicLink”类型的项目。
当您将 I/O 设备的路径(例如“\.\C:”或“\.\Changer0”)作为函数调用中的第一个参数传递时CreateFile,CreateFile 函数会解析该路径并删除“\ .\"从中找到路径的一部分。然后它搜索全局?与该部分同名的 SymbolicLink 目录。然后它找到符号链接引用的地址,这是主要的物理设备对象名称(例如,“\Device\CdRom0”)。
那么,我的发现是真的吗?这些设备是否包含在Global 中?目录是唯一该CreateFile功能可以打开的设备吗?只是提一下:不是Global 中的所有项目?我猜目录指的是设备。
IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS有一天,我想通过向显示器发送控制代码来以编程方式降低显示器的屏幕亮度。问题是我不知道为CreateFile函数的第一个参数指定什么。所以我做了以下事情:
显示#Default_Monitor#5&1193a8c7&0&UID100663553#{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}
CreateFile函数的第一个参数。 关于如何以编程方式完成所有这些操作有什么想法吗?我的意思是,我希望我的程序本身获取lpFileName参数的值。我不是直接将此字符串放在程序的源代码中。