Данная функция определяет присутствие нужной функции в библиотеке (dll) и, в случае нахождения искомой функции возвращает True, иначе False.

Иногда бывает полезно знать какими DLL-ками пользуется Ваше приложение. Давайте посмотрим как это можно сделать:

Автор: Simon Carter 

Пример функции

 

Code:

function LoadBitmap256(hInstance: HWND; lpBitmapName: PChar): HBITMAP;

var

hPal, hRes, hResInfo: THandle;

pBitmap: PBitmapInfo;

nColorData: Integer;

pPalette: PLogPalette;

X: Integer;

hPalette: THandle;

begin

 

hResInfo := FindResource(hInstance, lpBitmapName, RT_BITMAP);

hRes := LoadResource(hInstance, hResInfo);

pBitmap := Lockresource(hRes);

nColorData := pBitmap^.bmiHeader.biClrUsed;

 

hPal := GlobalAlloc(GMEM_MOVEABLE, (16 * nColorData));

 

{  hPal := GlobalAlloc( GMEM_MOVEABLE, ( SizeOf( LOGPALETTE ) +

(nColorData * SizeOf( PALETTEENTRY )));}

pPalette := GlobalLock(hPal);

pPalette^.palVersion := $300;

pPalette^.palNumEntries := nColorData;

 

for x := 0 to nColorData do

begin

   pPalette^.palPalentry[X].peRed := pBitmap^.bmiColors[X].rgbRed;

   pPalette^.palPalentry[X].peGreen := pBitmap^.bmiColors[X].rgbGreen;

   pPalette^.palPalentry[X].peBlue := pBitmap^.bmiColors[X].rgbBlue;

end;

 

hPalette := CreatePalette(pPalette^);

GlobalUnlock(hRes);

GlobalUnlock(hPal);

GlobalFree(hPal);

 

end;

 

end.

 

Код, представленный ниже демонстрирует простейшую DLL с всего одной функцией "TestDLL". Результат этой процедуры - диалоговое окошко с текстом.

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

{©Drkb v.3}

var

AModule: THandle;

begin

AModule := LoadLibrary('Images.dll');

image1.Picture.BitMap.LoadFromResourceName(AModule, 'StartMine');

FreeLibrary(AModule);

end;

 

 

Если ваш компьютер работает под управлением операционной системы Windows, то вы не можете не знать о существовании динамических подсоединяемых библиотек (dynamic link libraries - DLL). Достаточно взглянуть на список файлов, расположенных в системном каталоге Windows - порой количество используемых операционной системой динамических библиотек достигает нескольких сотен. DLL являются неотъемлемой частью функционирования операционных систем семейства Microsoft Windows. Однако для вас может быть неочевидна необходимость использования динамических библиотек при разработке приложений. В рамках данной статьи мы поговорим о принципах функционирования DLL и их использования в процессе создания ваших собственных программ.

 

 

Такой вот совет пришел ко мне с рассылкой "Ежедневная рассылка сайта Мастера DELPHI", думаю многим будет интересно.

 Решить эту задачу нам поможет функция function ExtractIcon(hInstance, filename, iconindex):integer где hinstance - глобальная переменная приложения, ее изменять не надо. Тип integer.

filename - имя программы или DLL из которой надо извлекать иконки. Тип pchar. iconindex - порядковый номер иконки в файле (начинается с 0). В одном файле может находится несколько иконок. Тип integer.

Функция находится в модуле ShellApi, так что не забудьте подключить его в uses. Если эта функция возвратит ноль, значит иконок в файле нет.

Данная функция возвращает handle иконки, поэтому применять ее нужно так: Image1.Picture.Icon.Handle:=ExtractIcon(hInstance, pchar(paramstr(0)), 0);

данное объявление нарисует в Image'e картинку вашего приложения.

 

Автор: Михаил Христосенко

При объявлении процедур и функций в динамических библиотеках используются различные соглашения о вызовах. Дело в том, что различные языки программирования по-разному реализуют передачу параметров в процедуру (через стек или регистры). Порядок следования параметров в стеке как раз определяется соглашением о вызовах.

 

Стандартный вызов в языках C++ и Object Pascal различается, но набор директив смены типа вызова позволяет обеспечить любую реализацию.

 

Во всех соглашениях о вызовах вызывающая процедура помещает параметры в стек. В зависимости от типа соглашения, очистка стека осуществляется вызывающей или вызываемой процедурой.

 

 

Code:

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.

 

 DLL возможно загружать двумя способами:

 

- статически

- динамически

  

Давайте создадим простую библиотеку DLL:

 

Project file name: c:\example\exdouble\exdouble.dpr

 

1)Создайте текстовый файл с расширением ".rc".Имя этого файла должно отличаться

от имени файла - пректа или любого модуля проекта.

Файл должен содержать строку вроде: MYJPEG JPEG C: \DownLoad\MY.JPG

где:

"MYJPEG" имя ресурса

"JPEG" пользовательский тип ресурса

"C: \DownLoad\MY.JPG" руть к JPEG файлу.

 

Пусть например rc - файл называется "foo.rc"

 

Запустите BRCC32.exe(Borland Resource CommandLine Compiler) - программа находится

в каталоге Bin Delphi / C + +Builder'а - передав ей в качестве параметра полный путь

к rc - файлу.

В нашем примере: