2

我正在尝试使用 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()

ExtractIconMSDN 上的功能)。

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

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

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

4

3 回答 3

3

对我有用,即使是 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
}

在此处输入图像描述

于 2012-09-17T19:22:12.360 回答
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");

来源。祝你今天过得愉快。

于 2018-06-12T05:13:18.570 回答
0

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

于 2012-09-18T14:39:02.287 回答