Ivan Akulov
Ivan Akulov

Reputation: 4323

Extracting icon using WinAPI in Qt app

I'm trying to extract icon from exe file using WinAPI, but it doesn't work.

Here's the code:

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);
}

Code outputs:

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

(ExtractIcon function on MSDN).

I think problem is that I send NULL instead of "A handle to the instance of the application calling the function". But, generally, I use Qt, and it's only one WinAPI function in my app.

What's wrong? What's correct way to extract icon using WinAPI? If you have another function proposal, please, give me an example. This is the first time I'm using WinAPI.

UPDATE: Yes, there is a better way. You may use QFileIconProvider class for doing such things.

Upvotes: 2

Views: 3398

Answers (3)

user9928328
user9928328

Reputation: 31

I used QFileIconProvider, and it worked perfectly. Try this :

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. Have a nice day.

Upvotes: 3

Ivan Akulov
Ivan Akulov

Reputation: 4323

And solution was very simple. I just sent path to '.lnk' file instead of path to file. That's my inattention.

Upvotes: 0

Pavel Zdenek
Pavel Zdenek

Reputation: 7278

Works for me, even with NULL. But obtaining the HINSTANCE is actually very simple. You have a problem elsewhere i guess. Does your target exe really have an embedded icon?

#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
}

enter image description here

Upvotes: 3

Related Questions