小编Jav*_*yat的帖子

将图标资源(不包括重复的)保存到磁盘

最近,我编写了一个程序,它加载可执行文件或 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++ resources winapi icons

2
推荐指数
1
解决办法
454
查看次数

CreateFile函数可以打开仅在全局下列出的设备的句柄吗?WinObj 实用程序中的目录?

您知道 - 在 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函数的第一个参数指定什么。所以我做了以下事情:

  1. 我打开设备管理器,在列表中找到了我的显示器设备。该设备的名称是“通用非 PnP 监视器”。
  2. 我右键单击该列表项,然后单击“属性”
  3. “属性”窗口中,我单击“详细信息”选项卡。然后我从属性下拉列表中选择物理设备对象名称。
  4. 在值部分,我找到了文本“\Device\0000006f”。
  5. 在WinObj中,我搜索了Global?? 引用“\Device\0000006f”的 SymbolicLink 目录。该 SymbolicLink 的名称很长:

显示#Default_Monitor#5&1193a8c7&0&UID100663553#{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}

  1. 然后我在前面提到的SymbolicLink名称前加上“\.\”,并将其指定为CreateFile函数的第一个参数。

关于如何以编程方式完成所有这些操作有什么想法吗?我的意思是,我希望我的程序本身获取lpFileName参数的值。我不是直接将此字符串放在程序的源代码中。

c++ winapi device

1
推荐指数
1
解决办法
2591
查看次数

标签 统计

c++ ×2

winapi ×2

device ×1

icons ×1

resources ×1