尝试使用 LoadImage 加载应用程序的图标,但该函数返回 0

2024-05-12

我正在尝试使用加载应用程序的图标LoadImageWinAPI函数,但由于某种原因它总是返回0。

我已阅读文档 https://msdn.microsoft.com/en-us/library/windows/desktop/ms648045(v=vs.85).aspx,但我无法理解我做错了什么。除了尝试转换外,我没有遇到任何例外IconPtr to Icon(这是因为IconPtr is 0).

Public Shared Function ExtractAssociatedIconArray(ByVal File As String, ByVal Sizes() As Size) As Icon()
    Dim ReturnArray(Sizes.Length) As Icon
    Dim Index As Integer = 0

    For Each s As Size In Sizes
        'IconPtr is always zero for some reason.
        Dim IconPtr As IntPtr = NativeMethods.LoadImage(Nothing, File, NativeMethods.Enumrations.IMAGE_ICON, s.Width, s.Height, NativeMethods.Enumrations.LR_DEFAULTCOLOR Or NativeMethods.Enumrations.LR_LOADFROMFILE)
        ReturnArray(Index) = Icon.FromHandle(IconPtr)
        Index += 1
    Next

    Return ReturnArray
End Function

The NativeMethods class:

Public Class NativeMethods
    <DllImport("user32.dll", SetLastError:=True)> _
    Public Shared Function LoadImage(ByVal hInst As IntPtr, _
                     ByVal lpszName As String,
                     ByVal uType As UInt32, _
                     ByVal cxDesired As Integer, _
                     ByVal cyDesired As Integer, _
                     ByVal fuLoad As UInt32) As IntPtr
    End Function

    Public Enum Enumrations As UInteger
        '' LoadImage ''
        IMAGE_BITMAP = 0
        IMAGE_ICON = 1
        IMAGE_CURSOR = 2
        LR_CREATEDIBSECTION = &H2000
        LR_DEFAULTCOLOR = &H0
        LR_DEFAULTSIZE = &H40
        LR_LOADFROMFILE = &H10
        LR_LOADMAP3DCOLORS = &H1000
        LR_LOADTRANSPARENT = &H20
        LR_MONOCHROME = &H1
        LR_SHARED = &H8000
        LR_VGACOLOR = &H80
    End Enum
End Class

使用示例:

Dim Icons() As Icon = ExtractAssociatedIconArray("C:\MyApp.exe", New Size() {New Size() {48, 48}})

你的处理方式是错误的。您正在将可执行文件名传递给lpszName的论证LoadImage。该参数不接受可执行文件名。它接受第一个参数指定的模块内的资源名称,hinst。文档中对此进行了解释。

您注意到您没有遇到异常。这是可以预料的。 Win32 API 不会引发异常。该文档再次描述了如何报告错误。它们由返回值报告NULL。当这种情况发生时,你打电话GetLastError获取错误代码。那将是Marshal.GetLastWin32Error来自.net。

做你正在尝试使用的事情LoadImage您需要执行以下操作:

  1. 通过调用获取实例句柄LoadLibraryEx传递可执行文件名。使用LOAD_LIBRARY_AS_DATAFILE标志,如文档所述。
  2. 将该实例句柄传递给LoadImage。您还需要知道要提取的图像资源的名称。
  3. 如果您不知道资源的名称,则需要使用资源枚举函数,例如EnumResourceNames。您正在寻找可执行文件中的第一个资源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试使用 LoadImage 加载应用程序的图标,但该函数返回 0 的相关文章

  • 装配和产品版本不匹配

    我正在尝试在 asp net 网站中使用 Ajax 控件工具包 我从之前的一个示例项目中复制了 dll 它有以下详细信息 Assembly Version 3 5 40412 0 File Version 3 5 40412 2 Inter
  • 有没有办法使值只能由嵌套类 VB.NET 的父级访问?

    总的来说 根据OOP范式 我对封装的理解基本上是这样的 如果成员是私有的 则只能由类访问 如果成员受保护 则只能由基类和任何派生类访问它 如果成员是公开的 则任何人都可以访问 如果我有一个嵌套类 我可以声明一个属性只能由该类及其嵌套的父类访
  • 如何使用 WinAPI 读取 MessageBox 文本

    如何读取标准Win消息框 Info 的消息 Using SendMessage this HandleControl WM GETTEXT builder Capacity builder 我只能读取消息框的标题或按钮的文本 但不能读取消息
  • 回发 Asp.Net 上的动态用户控件

    我创建了一个项目 user control 它有一个文本框 按钮等 它将有意收集用户想要的项目总数 我在 page load 上动态创建了几个 user control 实例 如果您单击项目数量的添加按钮 它将添加到会话变量中 但是 当用户
  • WM_NEXTDLGCTL 可以与非对话框窗口一起使用吗?

    的文档WM NEXTDLGCTL https msdn microsoft com en us library windows desktop ms645432 aspx声明该消息将与对话框一起使用 发送到对话框过程以将键盘焦点设置到对话框
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 多选DataGridView没有CTRL键没有闪烁?

    我在表单 Form1 vb 上有一个 DataGridView 控件 需要允许用户在不使用 CTRL 键的情况下多选行 没有可用的键盘 他们使用触摸屏 我已启用 mutliselect 属性 并在 Form 类中包含以下代码 我的 Data
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile
  • Activator.CreateInstance 缺少方法异常

    我在 C dll 中有一个类 其中包含以下类 public class RequiredTask Base BaseObject public string Name get set public string Description ge
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 如何在超时后关闭上下文菜单?

    我需要有一个上下文菜单 当前使用 TrackPopupMenu 创建 在一段时间不活动后自动关闭 我正在尝试搜索 但只找到相反的结果 如何activate超时后的弹出窗口 或针对特定应用程序的专门内容 我发现的唯一接近的事情是枚举桌面的子级
  • 如何在自定义用户控件(.Net 4、Winforms)上使用项目集合编辑器?

    我创建了一个UserControl其中包含一个自定义ToolStrip Control 在使用时UserControl在整个应用程序中 ToolStrip控件不能直接访问 因为它逻辑上嵌入在UserControl 因此 要访问的项目Tool
  • 使用 .NET 将二进制转换器转换为十进制

    我已经开始掌握一些编程基础知识 但我仍然很新并且缺乏经验 我正在编写的新程序遇到问题 我想要一个程序 将 8 位二进制数放入文本框中 按下按钮 然后显示二进制数的十进制值 下面是我尝试过的代码 Public Class Form1 Priv
  • 如何使用 P/Invoke 在 PowerShell 1.0 中调用 Win32 函数?

    在许多情况下 从 PowerShell 脚本调用 Win32 函数或其他一些 DLL 会很有用 给定以下函数签名 bool MyFunction char buffer int bufferSize 我听说 PowerShell CTP 2
  • 如何向 ggplot 标题和标题添加图标?

    现在我正在尝试将图标放入 ggplot 可视化中 为此 我在网上检查了一些教程 当我运行 Claus Wilke 的以下代码示例时 library ggtext library ggplot2 ggplot mtcars aes mpg d
  • 运行命令行进程并在该进程仍在运行时获取输出?

    如何运行命令行进程并在该进程仍在运行时获取输出 我的意思是使用自己的进度条运行 CLI 进程 可执行文件本身需要很长时间才能完成操作 所以我想从自己的进程中获取进度信息来显示我的应用程序中的进度 否则我不这样做在进程完成之前没有任何信息来显
  • 确定矩形在窗口内是否可见

    我想确定窗口内的矩形是否完全可见 我找到了 RectVisible 但该函数确定矩形的任何部分是否可见 我想知道整个矩形是否可见 有没有这方面的功能 首先通过使用将系统剪切区域 窗口的可见区域 变成一个区域GetRandomRgn http
  • Dictionary(Of String, String) 和 IDictionary(Of String, String) 有什么区别

    我可以用 IDictionary 做更多或更少的事情吗 这两个集合有何不同 IDictionary 只是一个接口 一个描述实现类必须执行的操作的契约 Dictionary 是一个实现该接口的具体类 因此必须提供 IDictionary 接口
  • 用户完成后关闭 Excel

    任务非常简单 我想从 VB net GUI 打开 Excel 文档 xls 用户将处理 Excel 文件 用户完成后关闭 Excel 文件 我想要VB net代码释放Excel对象 问题是 当用户关闭文件时 Excel 对象仍然可以在任务管
  • 中断/退出嵌套在 vb.net 中

    如何摆脱 vb net 中的嵌套 for 或循环 我尝试使用 exit for 但它只跳转或中断了一个 for 循环 我怎样才能做到以下几点 for each item in itemList for each item1 in itemL

随机推荐