【问题标题】:Extracting icon using WinAPI in Qt app在 Qt 应用程序中使用 WinAPI 提取图标
【发布时间】:2012-09-17 12:26:47
【问题描述】:

我正在尝试使用 WinAPI 从 exe 文件中提取图标,但它不起作用。

代码如下:

QIcon OSTools::AppsInterface::extractAppIcon(const QString &fileName) const {
    wchar_t *convertedName = new wchar_t[fileName.length() + 1];
    fileName.toWCharArray(convertedName);
    convertedName[fileName.length()] = '\0';
    HICON Icon = ExtractIcon(NULL, convertedName, 0);

    QPixmap pixmap = QPixmap::fromWinHICON(Icon);
    return QIcon(pixmap);
}

代码输出:

QPixmap::fromWinHICON(), failed to GetIconInfo()

(ExtractIcon function on MSDN).

我认为问题在于我发送 NULL 而不是“调用函数的应用程序实例的句柄”。但是,一般来说,我使用 Qt,它只是我的应用程序中的一个 WinAPI 函数。

怎么了?使用 WinAPI 提取图标的正确方法是什么?如果您有其他功能建议,请举个例子。这是我第一次使用 WinAPI。

更新:是的,有更好的方法。你可以使用QFileIconProvider 类来做这些事情。

【问题讨论】:

  • 我认为HICON 不为空?试试直接调用GetIconInfo看看报错结果是什么。
  • @Neil GetLastError() 在调用 GetIconInfo 之前返回错误 1402“无效的光标句柄”,在 - 0 之后。

标签: qt winapi icons exe


【解决方案1】:

对我有用,即使是 NULL。但是获取HIINSTANCE其实很简单。我猜你在其他地方有问题。你的目标 exe 真的有嵌入的图标吗?

#ifdef Q_WS_WIN
#include <qt_windows.h>
#endif

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
#ifdef Q_WS_WIN
  QString fileName("D:\\_dev\\eclipse\\eclipse.exe");
  wchar_t *convertedName = new wchar_t[fileName.length() + 1];
  fileName.toWCharArray(convertedName);
  convertedName[fileName.length()] = '\0';
  HINSTANCE hInstance = ::GetModuleHandle(NULL);
  HICON Icon = ::ExtractIcon(hInstance, convertedName, 0);
  ui->label->setPixmap(QPixmap::fromWinHICON(Icon));
#endif
}

【讨论】:

  • 作为此答案的更新,在 Qt 5 中 QPixmap::fromWinHICON 已被删除。请改用QtWin::fromHICON(位于&lt;QtWinExtras/qwinfunctions.h&gt;下)。
【解决方案2】:

我使用了QFileIconProvider,效果很好。试试这个:

QPushButton b;
b.show();

QIcon icon;
QFileIconProvider fileiconpr;
icon = fileIconProvider.icon(QFileInfo("/*file name*/"));

b.setIcon(icon);

// And you can also save it where you want : 
QPixmap pixmap = icon.pixmap( QSize(/*desired size*/)  );
pixmap.save("/Desktop/notepad-icon.png");

Source。祝你有美好的一天。

【讨论】:

    【解决方案3】:

    而且解决方案非常简单。我只是发送了“.lnk”文件的路径而不是文件的路径。那是我的疏忽。

    【讨论】:

    • 啊,所以你的Icon一直是NULL
    • @Neil hmmm...我记得它指向随机记忆点。
    猜你喜欢
    • 2019-07-31
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多