Читать «Виртуальная библиотека Delphi» онлайн - страница 58

Unknown

  qResH := Windows.LoadResource( AFHandle, qResInfoH );

  try     i_MsgBox( 'binary resource (Win API):',

            pChar(Windows.LockResource(qResH)) );

  finally Windows.FreeResource( qResH );

  end;

end;

{//// TestBinRes_VCLStream ////}

procedure TestBinRes_VCLStream( AFHandle:tHandle );

{ loading binary resource via VCL`s stream }

var

  qResStream : tResourceStream;

begin

  qResStream := tResourceStream.Create( AFHandle, 'RC1', RT_RCDATA );

  try     i_MsgBox( 'binary resource (VCL stream):',

            pChar(qResStream.Memory) );

  finally qResStream.Free;

  end;

end;

{//// TestStrRes_WinAPI ////}

procedure TestStrRes_WinAPI( AFHandle:tHandle );

{ loading string resource via usual windows-API }

const

  cBufSize = 512;

var

  qBuf : array[0..1,0..cBufSize-1]of Char;

begin

  Windows.LoadStringA( AFHandle, 1000, qBuf[0], cBufSize );

  Windows.LoadStringA( AFHandle, 1001, qBuf[1], cBufSize );

  i_MsgBox( 'string resources (Win API):',

    StrPas(qBuf[0])+#13+StrPas(qBuf[1]) );

end;

BEGIN

  TestSList;

  TestBuiltInStrRes;

  i_Call_FH_Method( TestBinRes_WinAPI );

  i_Call_FH_Method( TestBinRes_VCLStream );

  i_Call_FH_Method( TestStrRes_WinAPI );

END.

Замечания:

• Rесурсы частично вынесены во внешнюю DLL только для демонстрации, поскольку большинство вопросов в конференции подразумевает именно такое их использование.

• Если ресурсы слинкованы не в отдельную DLL, а в исполняемый файл проекта, в параметре AFHandle надо везде передавать `0` или значение переменной System.HInstance.

• Вместо функции Windows.FindResource() я предпочитаю FindResourceEx() с лишним явным параметром — `LanguageId`. Дело в том, что первая не всегда находит ресурсы, сделанные борландовскими компиляторами — семантика LanguageId по умолчанию определена MS не совсем однозначно.

• Для однозначности, я явно указал имя функции Windows.LoadStringA(). В NT работает еще функция LoadStringW(), которая возвращает строки UNICODE. В Win95 LoadStringW() возвращает код ошибки `not implemented`.

Внутренний формат ресурсов Windows

В каталоге DELPHI\DEMOS\RESXPLOR есть пример работы с ресурсами Windows на самом `фундаментальном` уровне — непосредствено с форматом PE COFF (Portable Executable Common Object File Format) для Win32. Данный раздел написан, в основном, для тех, кто захочет разобраться в этом стандартном примере Delphi.

Сами по себе ресурсы — индексированный набор данных с записями переменной длины. Чтобы конкретную запись ресурса можно было найти, у нее есть один из двух идентификаторов — имя (строка символов UNICODE) или целое число. Целыми числами идентифицируются, например, каталоги стандартных типов ресурсов и строки в таблицах. Большинство записей ресурсов стандартных типов идентифицируются именами. Практически, в именах ресурсов разумно использовать только подмножетсво стандартных символов ASCII (коды от 0 до 255). Описание стандартных типов ресурсов Windows можно посмотреть в on-line help`е любой IDE C или Delphi. Любопытно, что способ идентификации ресурса ( целое число или ссылка на имя ) специфицирован, скорее, не на уровне стандарта, а на уровне принятых соглашений. Для поиска ресурса мы, в общем случае, задаем три параметра: