【问题标题】:How to get size of a loaded icon in c++ winapi如何在c ++ winapi中获取加载图标的大小
【发布时间】:2012-11-04 06:49:58
【问题描述】:

我已经使用LoadImage() 函数加载了一个图标("c:\test.ico") 我怎样才能得到这个图标的大小? (其中的字节数) 我正在使用 c++ & winapi

HRSRC hRes = LoadImage ( NULL, icon, IMAGE_ICON, 0, 0, LR_LOADFROMFILE );
LPVOID lpResLock = LockResource(hRes);

(更准确地说,“lpResLock”指向的数据大小)

========更新====== 我知道sizeofresource() 但问题是,它从可执行文件加载资源。正如我在我的问题中所示,我正在从磁盘文件加载一个独立的本地资源。第二个问题是,hResInfo 参数必须必须使用FindResource 函数创建,在我的情况下,我使用的是LoadImage().. 所以这无济于事

【问题讨论】:

  • .res(和 .exe 强制)中每个资源的布局是否有帮助? MS 很好地记录了从this document 开始的所有内容。 ICO file format 与它结合使用可能会为您提供所需的内容。
  • LoadImage 返回一个 HICON。它不返回 HRSRC。这意味着您问题的整个前提都是错误的。
  • 您的代码返回一个 HICON。因为你通过了 IMAGE_ICON。 HICON 和 HRSRC 不兼容分配。我非常熟悉 HANDLE 的多态性。我也熟悉 LoadImage。
  • 退后一步,想想你在说什么。您的论点将得出这样的结论,即 create file 返回的 HANDLE 可以转换为 HBITMAP,然后传递给对位图进行操作的函数。或者转换为 HWND,现在,嘿,马上,我们通过调用 CreateFile 得到了一个窗口。
  • LoadImage 并不总是返回 HICON。这取决于您传递的参数。您的代码通过 IMAGE_ICON。所以你的代码总是返回 HICON。 HICON 是图标的句柄。 HRSRC 是资源的句柄。它们不相同,并且它们不兼容分配。你可以很容易地确认这一点。例如,尝试调用 FindResource,然后调用 GetIconInfo。奇怪的是你的思想如此封闭。我无法想象你的态度怎么能学到任何东西。

标签: c++ c windows winapi


【解决方案1】:

谷歌SizeofResource()。它是一个标准的 win32 API 函数 IIRC

这是函数原型:

DWORD WINAPI SizeofResource(
  _In_opt_  HMODULE hModule,
  _In_      HRSRC hResInfo
);

参数:

hModule [in, optional] 类型:HMODULE 可执行文件包含资源的模块的句柄。

hResInfo [in] 类型:HRSRC 资源句柄。此句柄必须使用 FindResource 或 FindResourceEx 函数创建。

更新-

那么,来自文件的资源长度 = 文件大小。

使用:GetFileLength() 函数编码如下:

DWORD GetFileLength(LPSTR fileName)
{
   DWORD len = 0;
   OFSTRUCT of;
   HFILE hFile = OpenFile(fileName,&of, OF_READ);
   GetFileSize(hFile,&len);
   CloseHandle(hFile);
   return len;
}

【讨论】:

  • 是的,我知道 sizeofresource().. 但问题是,它从可执行文件加载资源。正如我在问题中所示,我正在从磁盘文件加载一个独立的本地资源。第二个问题是,必须使用 FindResource 函数创建 hResInfo 参数,在我的情况下,我使用的是 LoadImage().. 所以这无济于事
  • 另外,这是不正确的(第 2 部分)。 GetFileSize() 返回 64 位文件长度的低位双字。高位 dword 在 out 参数中返回。您应该返回函数的结果;不是 out-param 中的值(如果已知文件小于 4gB,则无论如何都是可选的)。
  • GetFileAttributesEx 可能是获取文件大小的最简单方法。
  • @David Heffernan,这是不正确的。因为使用 ''GetFileAttributeEx'' 就像使用推土机杀死苍蝇一样。您必须传递枚举和结构,最后,您将文件大小检索为两个 DWORD,就像在“GetFileSize()”中一样。 ''GetFileAttributesEX'' 也会检索其他文件信息,从而导致开销。当有一个简单的''GetiFileSize()''函数仅仅为了获取文件大小而创建的时候,为什么还要用开销来解决这个问题呢?我反对您对错误信息的评论
  • 如果您有兴趣,这里是 Raymond 的文章:blogs.msdn.com/b/oldnewthing/archive/2007/10/23/5612082.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多