EXE・DLLからアイコンを取得する(U)          <TOP>


EXE・DLLファイルからアイコンを取り出します。

ExtractIconEx アイコンを取得

DrawIconEx アイコンを描画

GetDC デバイスコンテキストのハンドルを取得

ReleaseDC デバイスコンテキストを解放

 

アイコンを取得するファイルパスをエディットボックスにドラッグし『取得』ボタンをクリックします。

大きいアイコン、小さいアイコンを取得することができます。

 

'================================================================
'= EXE・DLLからアイコンを取り出す(U)
'=    (ExtractIconEx.bas)
'================================================================
#include "Windows.bi"

' EXE・DLLのアイコンのハンドルを取得
Declare Function Api_ExtractIconEx& Lib "shell32" Alias "ExtractIconExA" (ByVal lpszFile$, ByVal nIconIndex&, phiconLarge&, phiconSmall&, ByVal nIcons&)

' アイコンを描画
Declare Function Api_DrawIconEx& Lib "user32" Alias "DrawIconEx" (ByVal hDC&, ByVal xLeft&, ByVal yTop&, ByVal hIcon&, ByVal cxWidth&, ByVal cyWidth&, ByVal istepIfAniCur&, ByVal hbrFlickerFreeDraw&, ByVal diFlags&)

' アイコンのハンドルを開放
Declare Function Api_DestroyIcon& Lib "user32" Alias "DestroyIcon" (ByVal hIcon&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define DI_COMPAT 4                     'システムイメージで描画する
#define DI_DEFAULTSIZE 8                'widthとheightが0である場合、アイコン(マウスカーソル)をデフォルトのサイズで描画
#define DI_IMAGE 2                      'イメージを使ってアイコン(またはマウスカーソル)を描画
#define DI_MASK 1                       'マスクを使ってアイコン(またはマウスカーソル)を描画
#define DI_NORMAL 3                     'DI_IMAGE と DI_MASK の組み合わせ

Var Shared Edit1 As Object
Var Shared Text1 As Object
Var Shared Text2 As Object
Var Shared Picture1 As Object
Var Shared Button1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14
Picture1.Attach GetDlgItem("Picture1")
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared FileName As String

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var pDC As Long                     'Picture1ハンドル
    Var lIcon As Long                   '32×32アイコン
    Var sIcon As Long                   '16×16アイコン
    Var Ret As Long

    Picture1.Cls
    pDC = Api_GetDC(Picture1.GethWnd)

    Ret = Api_ExtractIconEx(FileName, 0, lIcon, sIcon, 1)

    If Ret = 1 Then
        Text2.SetWindowText "EXE・DLLではありません"
        Exit Sub
    Else If Ret = 0 Then
        Text2.SetWindowText "アイコンが存在しません"
        Exit Sub
    Else
        Ret = Api_DrawIconEx(pDC, 0, 0, lIcon, 0, 0, ByVal 0, 0, DI_NORMAL)
        Ret = Api_DrawIconEx(pDC, 32, 0, sIcon, 0, 0, ByVal 0, 0, DI_NORMAL)
    End If

    If Ret <> 0 Then
        Text2.SetWindowText "成功!"
    Else
        Text2.SetWindowText "失敗!"
    End If

    Ret = Api_ReleaseDC(GetHwnd, pDC)
    Ret = Api_DestroyIcon(lIcon)
    Ret = Api_DestroyIcon(sIcon)
End Sub

'================================================================
'= シェルドロップされたファイル名を取得
'================================================================
Declare Sub Edit1_DropFiles edecl (ByVal DF As Long)
Sub Edit1_DropFiles(ByVal DF As Long)
    Var CN As Long

    CN = GetDropFileCount(DF)
    FileName = GetDropFileName(DF, 0)
    Edit1.SetWindowtext FileName
End Sub
'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End