2013-05-20 2 views
0

런타임에는 특정 MenuItem의 특정 .EXE 파일의 기본 아이콘을로드하여 표시하려고합니다. 이 특정 .EXE 파일에 대해 액세스 제한 등으로 인해 불가능한 경우 MenuItem 아이콘을 특정 ImageList의 특정 아이콘 (예 : MyMenuItem.ImageIndex : = 7)으로 설정해야합니다. 어떻게 할 수 있습니까?Delphi XE2 : 런타임에 MenuItem에 EXE 아이콘로드

+0

사용'LoadLibraryEx' 당신이 다음 첫 번째 아이콘을 조회 할 수있는 모듈 핸들을 얻을 수 있습니다. –

+0

의미 : 'LoadLibraryEx (PChar (AExeFile), 0, LOAD_LIBRARY_AS_IMAGE_RESOURCE 또는 LOAD_LIBRARY_AS_DATAFILE); 그러나 LOAD_LIBRARY_AS_IMAGE_RESOURCE 선언을 찾을 수 없습니다. 그것이 선언 된 곳은 어디입니까? – user1580348

+0

Delphi와 함께 제공되는 RTL 단위에서 찾을 수 없다면 MSDN에서 찾아보십시오 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85) .aspx –

답변

2

가장 간단한 해결책은 ExtractIconEx을 사용하는 것입니다. 다음은 매우 간단한 예입니다.

type 
    PHICON = ^HICON; 

function ExtractIconEx(lpszFile: LPCWSTR; nIconIndex: Integer; 
    phiconLarge, phiconSmall: PHICON; nIcons: UINT): UINT; stdcall; external 'shell32.dll' name 'ExtractIconExW'; 

function GetSmallIconFromExecutableFile(const FileName: string): TIcon; 
var 
    Icon: HICON; 
    ExtractedIconCount: UINT; 
begin 
    Result := nil; 
    try 
    ExtractedIconCount := ExtractIconEx(
     PChar(FileName), 
     0, 
     nil, 
     @Icon, 
     1 
    ); 
    Win32Check(ExtractedIconCount=1); 
    Result := TIcon.Create; 
    Result.Handle := Icon; 
    except 
    Result.Free; 
    raise; 
    end; 
end; 
+0

그러나 ExtractIcon/ExtractIconEx가 특히 64 비트 실행 파일에서 항상 작동하지 않는 것으로 다른 사람들에 의해보고되었습니다. – user1580348

+0

인용문을 제공해야합니다. 그것이 어떻게 작동하지 않을지를보기는 매우 어렵다. –

+0

고마워요, 데이빗! 나는이 코드와 함께 사용하려했지만 작동하지 않는다. : 'NewItem.Bitmap.Canvas.Draw (0, 0, GetSmallIconFromExecutableFile (ExeFilePath)); ' 버그는 어디에 있습니까? – user1580348

1

실행 파일과 관련된 아이콘은 모듈의 첫 번째 아이콘입니다. 그래서 당신은 이런 식으로 추출 할 수 있습니다 : LOAD_LIBRARY_AS_IMAGE_RESOURCE 또는 LOAD_LIBRARY_AS_DATAFILE``와

function EnumResNameProc(hModule: HMODULE; lpszType: LPCTSTR; lpszName: LPTSTR; lParam: LONG_PTR): BOOL; stdcall; 
begin 
    HICON(Pointer(lParam)^) := LoadImage(
    hModule, 
    lpszName, 
    IMAGE_ICON, 
    GetSystemMetrics(SM_CXSMICON), 
    GetSystemMetrics(SM_CYSMICON), 
    0 
); 
    Result := False; 
end; 

function GetFirstSmallIcon(hmod: HMODULE): HICON; 
begin 
    Result := 0; 
    EnumResourceNames(hmod, RT_GROUP_ICON, @EnumResNameProc, NativeInt(@Result)); 
end; 

function GetSmallIconFromExecutableFile(const FileName: string): TIcon; 
const 
    LOAD_LIBRARY_AS_IMAGE_RESOURCE = $00000020; 
var 
    hmod: HMODULE; 
    Icon: HICON; 
begin 
    Result := nil; 
    try 
    hmod := LoadLibraryEx(PChar(FileName), 0, LOAD_LIBRARY_AS_IMAGE_RESOURCE or LOAD_LIBRARY_AS_DATAFILE); 
    Win32Check(hmod<>0); 
    try 
     Icon := GetFirstSmallIcon(hmod); 
     if Icon<>0 then begin 
     Result := TIcon.Create; 
     Result.Handle := Icon; 
     end; 
    finally 
     FreeLibrary(hmod); 
    end; 
    except 
    Result.Free; 
    raise; 
    end; 
end; 
+0

David, 당신은 최고입니다! 두 가지 솔루션 중 어느 것이 더 낫습니까? – user1580348

+0

개인적으로 나는'ExtractIconEx'를 선택할 것입니다. –