Номер іконки в Dll або Exe файлі більше їх кількості
Доброго дня, допоможіть розібратися будь ласка. Питання щодо іконок у Dll та Exe файлах. Наприклад кнопки Internet Exlorer посилаються на іконки в Dll або Exe файлі так: C:\PROGRAM FILES\SIBER SYSTEMS\AI ROBOFORM\ROBOFORM.DLL,201 Це нібито має означати, що потрібна іконка за № 201 Але справа в тому, що в цьому файлі їх тільки 20 (перевірено різними способами та програмами). Як дізнатися, яка потрібна іконка? Це точно не перша іконка файлу. Я користувався ExtractAssociatedIcon(РInstance, PChar(Name), IconIndex) та ExtractIcon(РInstance, PChar(Name), IconIndex) результат однаковий.
№201 це не номер іконки, а її ідентифікатор, а хто сказав, що вони мають бути по порядку? Хочеш витягти іконку з ідентифікатором № 201? Тоді роби LoadLibrary і далі LoadIcon з ідентифікатором.
а що це за функція? У TIcon такої немає. Який Delphi?
Народ, а чи можна приклад? Щось я не зовсім зрозумів.
>Nickolay (07.06.02 14:59) Ну що тут не зрозумілого. Іконки зазвичай зберігаються у ресурсах. Ресурси можуть бути як у exe, так і у dll. А іноді dll просто використовується як сховище ресурсів і нічого більше. Так от, якщо іконка знаходиться не у тебе в exe, а десь у dll то тобі необхідно завантажити цю dll за допомогою LoadLibrary. А потім використовуючи API ф-цію LoadIcon завантажити іконку з даної DLL. Особливу увагу зверніть на перший параметр ф-ції LoadIcon. Туди повинен передаватися handle твоєї завантаженої dll, яку ти отримаєш після LoadLibrary.
Loads an icon resource в icon object.
procedure LoadFromResourceName(Instance: Cardinal; const ResName: string);
LoadFromResourceName loads the specified icon resource from a module's executable file.
Instance is the handle of the module that containsthe resource.
ResName is the name of the resource to load.
2 Suntechnic Всім дякую за допомогу, тепер я зрозумів і все заробило.
Виникла ще одна проблема. Не витягуються іконки з EXE файлів під Win98/ME. LoadLibrary спрацьовує, а ось LoadIcon повертає 0. Хто-небудь знає в чому тут справа? ось код: procedure TForm1.Button2Click(Sender: TObject); var Name : String; Ico: HIcon; IconIndex : слово; AModule : THandle; begin Name := Edit3.Text; IconIndex := StrToInt(Edit4.Text); AModule := LoadLibraryEx(PChar(Name),0,LOAD_LIBRARY_AS_DATAFILE); Edit1.Text := IntToStr(AModule); Ico := LoadIcon(AModule,PChar(IconIndex)); Edit2.Text := IntToStr(Ico); DrawIcon(Form1.Canvas.Handle,10,10,Ico); FreeLibrary (AModule); end;
А ExtractAssociatedIcon() не підійде? Там і мороки менше.
ExtractAssociatedIcon() не повертає ту іконку. Ця ф-ция повертає іконки з їхньої порядковому номеру, тобто. не те, що мені треба. Виходить та сама проблема що я у питанні писав.
Ok, тоді ExtractIcon() - ця ту повертатиме.
2 Song Дякую, начебто працює якщо індекс іконки вказувати негативним.
І знову проблема. На Win2000 працює кілька методів, всі вони повертають те, що треба, але під 98 і Міленіум з DLL не витягує, що примітно з ЕХЕ витягує правильно.