런타임에는 특정 MenuItem의 특정 .EXE 파일의 기본 아이콘을로드하여 표시하려고합니다. 이 특정 .EXE 파일에 대해 액세스 제한 등으로 인해 불가능한 경우 MenuItem 아이콘을 특정 ImageList의 특정 아이콘 (예 : MyMenuItem.ImageIndex : = 7)으로 설정해야합니다. 어떻게 할 수 있습니까?Delphi XE2 : 런타임에 MenuItem에 EXE 아이콘로드
답변
가장 간단한 해결책은 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;
그러나 ExtractIcon/ExtractIconEx가 특히 64 비트 실행 파일에서 항상 작동하지 않는 것으로 다른 사람들에 의해보고되었습니다. – user1580348
인용문을 제공해야합니다. 그것이 어떻게 작동하지 않을지를보기는 매우 어렵다. –
고마워요, 데이빗! 나는이 코드와 함께 사용하려했지만 작동하지 않는다. : 'NewItem.Bitmap.Canvas.Draw (0, 0, GetSmallIconFromExecutableFile (ExeFilePath)); ' 버그는 어디에 있습니까? – user1580348
실행 파일과 관련된 아이콘은 모듈의 첫 번째 아이콘입니다. 그래서 당신은 이런 식으로 추출 할 수 있습니다 : 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;
David, 당신은 최고입니다! 두 가지 솔루션 중 어느 것이 더 낫습니까? – user1580348
개인적으로 나는'ExtractIconEx'를 선택할 것입니다. –
- 1. 런타임 패키지에서 exe 파일을 실행하는 데 문제가 있습니다. delphi xe2
- 2. Delphi XE2 스타일로 페인팅
- 3. Delphi Xe2 패키지 x64
- 4. Delphi XE2 future
- 5. TThreadedStringList in delphi xe2
- 6. Delphi XE2 TPointerList 사용
- 7. FastString Delphi XE2 대안
- 8. Delphi XE2 어셈블리
- 9. SafeMM for Delphi XE2
- 10. Delphi XE2 FireMonkey보고 옵션
- 11. Delphi XE2 - 프로젝트를 SVN
- 12. DateToStr 및 Delphi XE2
- 13. Delphi XE2 modern looking MainMenu
- 14. TMonthCalendar 및 Delphi 스타일 (Delphi XE2)
- 15. Delphi XE2 DBExpress Access Violation?
- 16. FireMonkey에서 ColumnCount 변경하기 Delphi XE2
- 17. Delphi XE2 및 TeeChart 9
- 18. Delphi xe2 및 filectrl 단위
- 19. Delphi (XE2) 유니 코드 버전
- 20. Delphi XE2 : firemonkey 및 IDirect3DDevice9
- 21. Delphi XE2 FireMonkey and ssl
- 22. Delphi XE2 코드 완성 깨짐
- 23. TRemotable 클래스의 Delphi XE2 제네릭
- 24. Delphi XE2 Firemonkey 파일 다운로드?
- 25. Delphi XE2 IdTCPClient - 데이터를받는 방법?
- 26. 런타임에 dll로드 - Delphi
- 27. XE2 exe 인 및 DCU 위치
- 28. 도움이 필요하십니까? Delphi XE2 Enterprise 또는 Delphi XE2 Professional 사이에서 결정
- 29. 간단한 Delphi XE2 32 비트 VCL 구성 요소에 Delphi XE2 64 비트 지원을 추가하는 방법은 무엇입니까?
- 30. Delphi XE2 : OSX의 Delphi FireMonkey 앱에 PDF 표시
사용'LoadLibraryEx' 당신이 다음 첫 번째 아이콘을 조회 할 수있는 모듈 핸들을 얻을 수 있습니다. –
의미 : 'LoadLibraryEx (PChar (AExeFile), 0, LOAD_LIBRARY_AS_IMAGE_RESOURCE 또는 LOAD_LIBRARY_AS_DATAFILE); 그러나 LOAD_LIBRARY_AS_IMAGE_RESOURCE 선언을 찾을 수 없습니다. 그것이 선언 된 곳은 어디입니까? – user1580348
Delphi와 함께 제공되는 RTL 단위에서 찾을 수 없다면 MSDN에서 찾아보십시오 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85) .aspx –