提取快捷方式的图标资源问题

问题点:获取桌面上的快捷方式并提取出图标资源。

问题点分析:1、如何获取桌面上的快捷方式?2、如果通过快捷方式路径提取到图标资源?

问题一:获取桌面上的快捷方式:

  Windows桌面上的文件保存在两个文件夹下,分别是:公共桌面文件夹和用户桌面文件夹。一般对于的系统路径是为系统盘下,例如:C:\Users\smart\Desktop(用户)和C:\Users\Public\Desktop(公共)。然后对这两个文件夹下的文件遍历筛选出扩展名为lnk的快捷方式.

  对于实际编程中,桌面的文件路径是一种系统特殊文件夹路径,不能规定死了。而且如果使用过桌面文件迁移软件对桌面迁移过,桌面文件夹的目录也会发生变化。不过,微软为我们提供了一些API获取特殊文件路径。

  1、BOOL SHGetSpecialFolderPath( HWND hwnd,  //保留,设置为NULL

                   LPSTR pszPath, //特殊文件夹路径

                      int csidl,              //需要获取的特殊文件夹类型,如果是虚拟文件夹,获取失败

                   BOOL fCreate    //如果文件夹不存在,是否创建

                   );

    该函数在以后可能不在受支持,可以采用新的API。

 

  2、SHFOLDERAPI SHGetFolderPath( HWND hwnd, //保留,设置为NULL

                       int csidl,          //需要获取的特殊文件夹类型,如果是虚拟文件夹,获取失败

                     HANDLE hToken, //访问令牌,一般设置为NULL,也可以传入当前登录用户的令牌.

                                                                       DWORD dwFlags, //指定要返回的路径的标志

                                                                        LPSTR pszPath //特殊文件夹路径

                     );

    从Windows Vista开始,该函数只是SHGetKnownFolderPath的包装器。

 

  3、HRESULT SHGetKnownFolderPath( REFKNOWNFOLDERID rfid,  //获取特殊文件夹路径类型

                    DWORD dwFlags, //指定特殊检索选项的标志,可以为0

                    HANDLE hToken, //访问令牌, 一般为空,如果为空,则该函数请求当前用户的已知文件夹,否则请求特定用户的已知文件夹

                    PWSTR *ppszPath //特殊文件夹路径 调用进程负责通过CoTaskMemFree调用释放不再需要的资源

                    );

    对该函数封装一个获取系统特殊文件夹路径的类,方便使用。

 

  获取到桌面文件目录后,我们就可以对文件夹下的文件进行枚举,通过文件扩展名筛选出快捷方式的文件。可以使用c++14标准库中的filesystem::path进行枚举,这里主要使用微软提供的API函数:

  1、HANDLE FindFirstFile( LPCSTR lpFileName, //查询的文件目录或路径

              LPWIN32_FIND_DATAA lpFindFileData //接收有关找到的文件或目录的信息

               );

  2、BOOL FindNextFile( HANDLE hFindFile,  //通过FindFirstFile返回的文件句柄

             LPWIN32_FIND_DATAA lpFindFileData //接收有关找到的文件或目录的信息

              );

  通过这两个函数就可以对指定文件目录下的文件进行查询,获取文件相关信息。FindFirstFileEx函数是FindFirstFile扩展函数,如果需要获取其他文件属性,使用该函数。

问题二:通过快捷方式路径提取图标资源:

  当我们获取到快捷方式的路径后,还需要进一步处理才能提取到图标资源。通过快捷方式提取信息需要用到windows提供的COM接口:IShellLink。是由COM接口之前,都需要初始化COM。然后创建IShellLink的接口实例,其中通过GetIconLocation接口函数获取到制定快捷方式的图标路径,但是如果该快捷方式图标资源不是.ico,则获取的图标路径为空。我们可以通过右键快捷方式属性查看到图标资源是否使用的是.ico文件.

 

  

 但很多快捷方式并不是直接使用.ico资源文件,而是.exe中编译时编译成二进制的icon资源。

 

 

  对于这种快捷方式指向的资源路径为可执行路径时,可以通过其他方式从执行文件或dll文件中提取图标句柄,将图标句柄转换为图标资源。IShellLink::GetPath可以获取到快捷方式的目标文件路径,即可执行路径(并不一定是是.exe文件)。微软为我们提供了一些API获取图标资源句柄:

  1、HICON ExtractIconA( HINSTANCE hInst,  //调用该函数的实例句柄 一般为NULL

                LPCSTR pszExeFileName, //可执行文件,DLL或图标文件的名称

                                                     UINT nIconIndex               //要检索的图标的从零开始的索引 0:表示从第一个开始,-1:获取图标总数

              );

  该函数和ExtractIconEx(提取大图标和小图标)一般提取16*16 和32*32像素的图标.使用完图标资源后,调用DestoryIcon是否资源。

 

  如果需要提取一些像素更大的图标资源,上面的API就无法实现了,需要使用其他API获取。

  1、DWORD_PTR SHGetFileInfoW( LPCWSTR pszPath,          //提取图标资源的文件路径

                  DWORD dwFileAttributes, //文件属性标志位

                  SHFILEINFOW *psfi,         //接收文件信息

                  UINT cbFileInfo,               //指向SHFILEINFO结构体大小

                  UINT uFlags                    //要检索的文件信息的标志

                  );

    在调用SHGetFileInfo之前, 必须初始化组件对象模型(COM).

   2、SHSTDAPI SHGetImageList( int iImageList,

                 REFIID riid,

                    void **ppvObj

                );

    如果提取48*48或256*256像素大小的图标,需要使用该函数获取。Windows系统标准图标大小分别为:小(16 *16) 大(32 * 32)超大(48 *48)和巨型(256 *256).所以通过API获取的一般是系统标准大小的图标,但是有些应用存在其他大小的不同,例如:64 * 64 128 *128等像素大小的图标,可以同过PE格式提取等方式,具体方式,目前还为找到。

   关于如何将HICON图标句柄资源保存到本地,可以使用GDI接口将HICON保存为bmp格式的图片文件,但是bmp占用空间大,压缩比较差,使用GDI比较麻烦,如果感兴趣的同学,可以使用微软封装的gdiplus库,转换方便,且可以将图标资源转换为其他格式。

 

参考:

1、https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderpatha

2、https://www.cnblogs.com/aspring/archive/2005/03/12/117337.html

3、https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfilea

4、https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ishelllinka

5、https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-extracticona

6、https://stackoverflow.com/questions/16330403/get-hbitmaps-for-all-sizes-and-depths-of-a-file-type-icon-c

7、https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetfileinfow

8、https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetimagelist 。   

   

转载于:https://www.cnblogs.com/smartNeo/p/11386109.html

### 回答1: 要在NVIDIA驱动包中提取NVIDIA Control Panel,您可以按照以下步骤进行操作: 1. 首先,从NVIDIA官方网站上下载适用于您的操作系统的最新驱动包。确保选择正确的驱动版本,以匹配您的显卡型号和操作系统。 2. 一旦下载完成,双击运行驱动包的可执行文件。这将解压驱动程序的文件到一个临时文件夹,通常位于C:\NVIDIA文件夹下。 3. 打开文件资源管理器,并导航到解压缩的临时文件夹。 4. 在文件夹中,您会找到一个名为"Display.Driver"的子文件夹。打开该文件夹,并继续打开一个名为"NVDisplay.Container.exe"的子文件夹。 5. 在该子文件夹中,您将找到一个名为"NvCplSetupInt.exe"的应用程序。这个应用程序就是NVIDIA Control Panel的安装文件。 6. 双击运行"NvCplSetupInt.exe",然后按照安装程序的指示完成安装过程。安装程序将自动安装NVIDIA Control Panel并创建相关的快捷方式。 7. 一旦安装完成,您就可以在桌面或系统托盘中找到NVIDIA Control Panel的快捷方式。点击它,即可打开并使用它来调整和管理您的NVIDIA显卡的设置和选项。 请注意,提取和安装NVIDIA Control Panel需要具备管理员权限,确保您以管理员身份登录到计算机上。此外,如果您之前已经安装过NVIDIA驱动程序,则可能无需提取,而只需通过控制面板中的程序和功能进行更新即可获取最新的NVIDIA Control Panel。 ### 回答2: 要在NVIDIA驱动包中提取NVIDIA Control Panel,您可以按照以下步骤操作: 1. 首先,您需要下载适用于您的显卡的最新的NVIDIA驱动包。您可以前往NVIDIA官方网站,在"驱动程序"部分选择您的显卡型号和操作系统,然后下载最新的驱动程序。 2. 下载完成后,您可以将驱动程序保存在一个目录中,然后解压缩该驱动程序。可以使用解压缩工具(如WinRAR或7-Zip)来解压缩驱动程序包。 3. 解压缩后,您将在提取的文件中找到一个名为"setup.exe"的文件。这是NVIDIA驱动程序的安装程序。 4. 右键单击"setup.exe"文件,并选择"以管理员身份运行"选项。这将启动NVIDIA驱动程序的安装向导。 5. 在安装向导中,您将看到一个选项,询问您是否要安装NVIDIA Display Driver(NVIDIA显示驱动程序)。确保选中此选项,并继续进行安装。 6. 安装完成后,您可以在系统托盘的通知区域找到NVIDIA Control Panel图标。单击该图标即可打开NVIDIA Control Panel。 7. 您也可以通过在开始菜单中搜索"NVIDIA Control Panel"来找到并打开它。 请注意,提取NVIDIA Control Panel是通过安装NVIDIA驱动程序来实现的。因此,确保按照设备和操作系统的要求正确下载和安装最新的NVIDIA驱动程序。 ### 回答3: 要在NVIDIA驱动程序包中提取NVIDIA控制面板,您可以按照以下步骤进行操作: 1. 首先,您需要从NVIDIA官方网站下载适用于您的图形卡的最新驱动程序包。确保选择正确的操作系统和图形卡型号。 2. 下载完成后,将驱动程序包保存到您的计算机上,例如桌面或文档文件夹。 3. 接下来,您需要解压缩驱动程序包。您可以右键单击下载文件,然后选择“解压缩”或使用解压缩软件,如WinRAR或7-Zip等。 4. 打开解压缩后的文件夹,您将看到其中包含许多文件和文件夹。 5. 在文件夹中,找到名为“NVCP”的文件夹。如果找不到该文件夹,可以尝试查找名为“Display.Driver”或“ControlPanel”的文件夹。 6. 进入“NVCP”文件夹,您将找到“nvcplui”或“nvcplui.exe”文件,这就是NVIDIA控制面板的可执行文件。 7. 将“nvcplui”文件复制到您喜欢的位置,例如桌面或快捷方式文件夹。 8. 完成上述步骤后,您现在可以双击“nvcplui”文件,即可运行NVIDIA控制面板。 请注意,这些步骤可能会因NVIDIA驱动程序包的版本而有所不同。如果您无法找到对应的文件夹或文件,请尝试搜索一些其他相关文件或与NVIDIA控制面板相关的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值