Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить все имена ресурсов, что были загружены данным приложением

Delphi , Файловая система , Ресурсы

Получить все имена ресурсов, что были загружены данным приложением

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

type
   TForm1 = class(TForm)
     Button1: TButton;
     Memo1: TMemo;
     procedure Button1Click(Sender: TObject);
   private
   end;

 var
   Form1: TForm1;

 implementation

 {$R *.dfm}

 function enumResNamesProc(module: HMODULE; restype, resname: PChar;
   list: TStrings): Integer; stdcall;
 begin
   if HiWord(Cardinal(resname)) <> 0 then
     list.Add('  ' + resname)
   else
     list.Add(Format('  #%d', [loword(Cardinal(resname))]));
   Result := 1;
 end;

 Function StockResourceType(restype: PChar): string;
 const
   restypenames: Array [1..22] of String =
     ( 'RT_CURSOR', //       = MakeIntResource(1); 
      'RT_BITMAP', //       = MakeIntResource(2); 
      'RT_ICON',   //       = MakeIntResource(3); 
      'RT_MENU',   //       = MakeIntResource(4); 
      'RT_DIALOG', //       = MakeIntResource(5); 
      'RT_STRING', //       = MakeIntResource(6); 
      'RT_FONTDIR',//       = MakeIntResource(7); 
      'RT_FONT',   //       = MakeIntResource(8); 
      'RT_ACCELERATOR',//   = MakeIntResource(9); 
      'RT_RCDATA', //       = MakeIntResource(10); 
      'RT_MESSAGETABLE',//  = MakeIntResource(11); 
      // DIFFERENCE = 11; 
      'RT_GROUP_CURSOR',// = MakeIntResource(DWORD(RT_CURSOR +7DIFFERENCE)); 
      'UNKNOWN',        // 13 not used 
      'RT_GROUP_ICON',  //   = MakeIntResource(DWORD(RT_ICON +DIFFERENCE)); 
      'UNKNOWN',        // 15 not used 
      'RT_VERSION',     // = MakeIntResource(16); 
      'RT_DLGINCLUDE',  // = MakeIntResource(17); 
      'UNKNOWN',
       'RT_PLUGPLAY',    // = MakeIntResource(19); 
      'RT_VXD',         // = MakeIntResource(20); 
      'RT_ANICURSOR',   // = MakeIntResource(21); 
      'RT_ANIICON'     // = MakeIntResource(22); 
    );
 var
   resid: Cardinal absolute restype;
 begin
   if resid in [1..22] then
     Result := restypenames[resid]
   else
     Result := 'UNKNOWN';
 end;


 function enumResTypesProc(module: HMODULE; restype: PChar; list: TStrings): Integer; stdcall;
 begin
   if HiWord(Cardinal(restype)) <> 0 then
     list.Add(restype)
   else
     list.Add(Format('Stock type %d: %s', [LoWord(Cardinal(restype)),
       StockResourcetype(restype)]));
   EnumResourceNames(module, restype, @enumResNamesProc, Integer(list));
   Result := 1;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   memo1.Clear;
   if not EnumResourceTypes(hinstance, @enumResTypesProc, Integer(memo1.Lines)) then
     memo1.Lines.Add(Format('GetLastError= %8.8x', [GetLastError]))
   else
     memo1.Lines.Add('Successful');
 end;

 end.

Перевод контента на русский язык:

Этот код-snippet на Delphi предназначен для извлечения имен ресурсов, которые были загружены приложением.

Вот подробное описание каждого шага:

  1. TForm1 - это основная форма приложения, которая содержит кнопку и текстовый блок.
  2. Процедура Button1Click вызывается при клике на кнопку. Она очищает текстовый блок и затем пытается перечислить все типы ресурсов в текущем модуле с помощью функции EnumResourceTypes.
  3. Функция enumResTypesProc - это callback-функция, которая вызывается для каждого типа ресурса, найденного функцией EnumResourceTypes. Эта функция перечисляет имена ресурсов для каждого типа ресурса с помощью функции EnumResourceNames и добавляет их в текстовый блок.
  4. Функция StockResourceType принимает тип ресурса в качестве входного параметра и возвращает соответствующее имя из массива предопределенных имен типов ресурсов.

Когда вы запустите этот код, он отобразит все имена ресурсов, загруженных приложением, в текстовом блоке. Если возникнут ошибки во время процесса перечисления, они также будут отображаться.

Для улучшения этого кода есть несколько предложений:

  1. Обработка ошибок: текущая реализация только отображает последнюю ошибку, которая произошла во время процесса перечисления. Вам может быть полезно отображать все ошибки, которые возникли.
  2. Фильтрация типов ресурсов: если вы интересуетесь конкретными типами ресурсов (например, только курсорами или битмапами), вы можете добавить фильтр в функцию enumResTypesProc, чтобы пропустить неинтересующие вас типы ресурсов.
  3. Форматирование текстового блока: текущая реализация добавляет каждое имя ресурса в текстовый блок как отдельную строку. Вам может быть полезно добавить форматирование, например, отступы, для удобочитаемости.

В качестве альтернативных решений вы также можете использовать функцию EnumResourceTypesEx вместо EnumResourceTypes. Эта функция предоставляет больше контроля над процессом перечисления и позволяет указать дополнительные параметры.

Вот пример, как вы можете модифицировать код с помощью EnumResourceTypesEx:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  if not EnumResourceTypesEx(HInstance, @enumResTypesProc, Integer(Memo1.Lines), 0) then
    Memo1.Lines.Add(Format('GetLastError=%8.8x', [GetLastError]))
  else
    Memo1.Lines.Add('Successful');
end;

function enumResTypesProc(module: HMODULE; restype: PChar; list: TStrings): Integer;
begin
   // Ваши код для обработки типа ресурса здесь...
  Result := 1;
end;

В этом примере EnumResourceTypesEx используется с callback-функцией, которая принимает три параметра: handle модуля, имя типа ресурса и строковый список. Функция возвращает целочисленное значение, указывающее, успешна ли была перечисление.

Получить имена ресурсов, загруженных приложением, можно с помощью функции EnumResourceTypes, которая вызывает процедуру enumResTypesProc для каждого типа ресурса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ресурсы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 00:52:44/0.0035209655761719/0