Windows
Данная функция определяет присутствие нужной функции в библиотеке (dll) и, в случае нахождения искомой функции возвращает True, иначе False.
- Подробности
- Родительская категория: Windows
- Категория: Работа с DLL
Иногда бывает полезно знать какими DLL-ками пользуется Ваше приложение. Давайте посмотрим как это можно сделать:
Автор: Simon Carter
Пример функции
- Подробности
- Родительская категория: Windows
- Категория: Работа с DLL
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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Код, представленный ниже демонстрирует простейшую DLL с всего одной функцией "TestDLL". Результат этой процедуры - диалоговое окошко с текстом.
- Подробности
- Родительская категория: Windows
- Категория: Работа с DLL
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
- Категория: Работа с ресурсами
Если ваш компьютер работает под управлением операционной системы Windows, то вы не можете не знать о существовании динамических подсоединяемых библиотек (dynamic link libraries - DLL). Достаточно взглянуть на список файлов, расположенных в системном каталоге Windows - порой количество используемых операционной системой динамических библиотек достигает нескольких сотен. DLL являются неотъемлемой частью функционирования операционных систем семейства Microsoft Windows. Однако для вас может быть неочевидна необходимость использования динамических библиотек при разработке приложений. В рамках данной статьи мы поговорим о принципах функционирования DLL и их использования в процессе создания ваших собственных программ.
- Подробности
- Родительская категория: 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 картинку вашего приложения.
Автор: Михаил Христосенко
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
При объявлении процедур и функций в динамических библиотеках используются различные соглашения о вызовах. Дело в том, что различные языки программирования по-разному реализуют передачу параметров в процедуру (через стек или регистры). Порядок следования параметров в стеке как раз определяется соглашением о вызовах.
Стандартный вызов в языках C++ и Object Pascal различается, но набор директив смены типа вызова позволяет обеспечить любую реализацию.
Во всех соглашениях о вызовах вызывающая процедура помещает параметры в стек. В зависимости от типа соглашения, очистка стека осуществляется вызывающей или вызываемой процедурой.
- Подробности
- Родительская категория: Windows
- Категория: Работа с DLL
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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
DLL возможно загружать двумя способами:
- статически
- динамически
Давайте создадим простую библиотеку DLL:
Project file name: c:\example\exdouble\exdouble.dpr
- Подробности
- Родительская категория: Windows
- Категория: Работа с DLL
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 - файлу.
В нашем примере:
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Страница 25 из 42