Виртуальная библиотека Delphi - [29]
>RC1 RCDATA
>{
>'51 57 45 52 54 59 00'
>}
>STRINGTABLE
>{
>1000, "Здравствуйте ."
>1001, "До свидания ..."
>}
Файл `Proj_L.Dpr`:
Мы используем Delphi как линкер, чтобы дописать стандартный заголовок исполняемых файлов Windows к файлу `#_Msg.Res`. Последний делается компилятором ресурсов из скрипта `#_Msg.RC`. IDE может ругаться при загрузке этого проекта из-за отсутствия секции `uses` —дура.
>{$IMAGEBASE $40000000}
>{$APPTYPE CONSOLE}
>library Proj_L;
>{$R #_MSG.RES}
>BEGIN
>END.
Файл `Make_DLL.Bat`:
Компилируем скрипт `#_Msg.RC` в файл `#_Msg.Res`; компилируем и линкуем проект `Proj_L.Dpr`. Получаем файл `Proj_L.Dll`.
>rem –- may be used BRC32 or BRCC32
>rem c:\del3\bin\brc32 –r #_msg.rc
>c:\del3\bin\brcc32 #_msg.rc
>c:\del3\bin\dcc32 /b proj_l.dpr
>pause
Файл `Proj.Dpr`
>{$APPTYPE GUI}
>{$D+,O-,S-,R-,I+,A+,G+}
>{$IfOpt D-} {$O+} {$EndIf}
>program Proj;
>{$IfNDef WIN32}
> error: it works only under Win32
>{$EndIf}
>uses
> Windows,
> SysUtils,
> Classes;
>{//////////////////////////////////////////////}
>procedure i_MsgBox( const ACap,AStr:String );
>{ service routine: simple message-box }
>begin
> Windows.MessageBox( 0, pChar(AStr), pChar(ACap),
> MB_OK or MB_ICONINFORMATION );
>end;
>{///// TestSList ////}
>procedure TestSList;
>{ load strings from ini-file via tStringList }
>const
> cFName = '#_MSG.INI';
>var
> qSList : tStringList;
>begin
> qSList := tStringList.Create;
> with qSList do try
> LoadFromFile( ExtractFilePath(ParamStr(0))+cFName );
> i_MsgBox( 'strings collection via VCL:',
> Trim(Values['msghello'])+#13+Trim(Values['MSGBYE']) );
> finally Free;
> end;
>end;
>{//// TestBuiltInStrRes ////}
>RESOURCESTRING
> sMsgHello = 'ЯВЕРТЫяверты';
> sMsgBye = 'явертыЯВЕРТЫ';
>procedure TestBuiltInStrRes;
>{ load strings from resources via Delphi`s Linker }
>begin
> i_MsgBox( 'built-in string resources:', sMsgHello+#13+sMsgBye );
>end;
>{//////////////////////////////////////////////}
>type
> tFH_Method = procedure( AFHandle:tHandle );
>{ `AFHandle` must be a handle of instance of image (of memory-map)
> of a PE-file (EXE or DLL) }
>procedure i_Call_FH_Method( AProc:tFH_Method );
>{ it is wrapper to load and free a instance of binary
> file with resource; also it calls to "AProc()" with
> given instance-handle }
>const
> cLibName = 'PROJ_L.DLL';
>var
> qFHandle : tHandle;
>begin
> qFHandle := Windows.LoadLibrary(
> pChar(ExtractFilePath(ParamStr(0))+cLibName) );
> if qFHandle=0 then
> i_MsgBox( 'Error loading library',
> Format('Code# %xh',[Windows.GetLastError]) )
> else
> try AProc( qFHandle );
> finally Windows.FreeLibrary( qFHandle );
> end;
>end;
>{//// TestBinRes_WinAPI ////}
>procedure TestBinRes_WinAPI( AFHandle:tHandle );
>{ loading binary resource via usual windows-API }
>var
> qResH,
> qResInfoH : tHandle;
>begin
> qResInfoH := Windows.FindResourceEx( AFHandle , RT_RCDATA, 'RC1', 0 );
> 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.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге собраны предания и поверья о призраках ночи — колдунах и ведьмах, оборотнях и вампирах, один вид которых вызывал неподдельный страх, леденивший даже мужественное сердце.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
…«Песнь о Нибелунгах» принадлежит к числу наиболее известных эпических произведений человечества. Она находится в кругу таких творений, как поэмы Гомера и «Песнь о Роланде», «Слово о полку Игореве» и «Божественная комедия» Данте — если оставаться в пределе европейских литератур…В. Г. Адмони.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.