2012-09-17 2 views
1

WinAPI를 사용하여 exe 파일에서 아이콘을 추출하려고하는데 작동하지 않습니다.Qt 앱에서 WinAPI를 사용하여 아이콘 추출 중

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 클래스를 사용할 수 있습니다.

+0

나는'HICON'을 null이 아닌가? 'GetIconInfo'를 직접 호출하여 오류 결과를 확인하십시오. – Neil

+0

GetIconInfo를 호출하기 전에 @Neil GetLastError()가 오류 1402 "잘못된 커서 핸들"을 반환합니다. - –

답변

0

#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 
} 
그리고 해결책은 아주 간단했다. 방금 파일 경로 대신 '.lnk'파일 경로를 보냈습니다. 그건 내 부주의 다.

+0

아, 그럼'Icon'이 모두 NULL입니까? – Neil

+0

@Neil hmmm ... 내가 기억하는 것만 큼 좋지 않은 메모리 포인트를 지적했다. –

1

NULL이더라도 나를 위해 작동합니다. 그러나 HINSTANCE를 얻는 것은 실제로 매우 간단합니다. 내가 다른 곳에서 문제가 생겼어. 귀하의 타겟 exe는 정말로 임베디드 아이콘을 가지고 있습니까?

enter image description here

관련 문제