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でも機能します。しかし、HINSTANCEの取得は実際には非常に簡単です。あなたは私が推測する他の場所で問題を抱えています。ターゲット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");

ソース。良い1日を。

于 2018-06-12T05:13:18.570 に答える
0

そして、解決策は非常に簡単でした。ファイルへのパスではなく、「。lnk」ファイルへのパスを送信しました。それは私の不注意です。

于 2012-09-18T14:39:02.287 に答える