![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL на старте отсутствует! [D5, Win95/98, NT4, WinXP]
Eugenex © (2002-11-20 10:49:00)Собрал прогу, которая должна работать как в 98-й так и в НТ.
Версии различить могу.
Но... прога юзает пару DLL, которых может небыть в 98-й.
Поэтому на старте крик и полный даун.
Как мне сделать так, чтобы в отсутствии некой DLL функции ее
использующие просто отключались, а работа проги продолжалась ???
Просьба ответить на мыло.
Спасибо.
Игорь Шевченко (2002-11-20 11:09:00) [1]LoadLibrary + GetProcAddress
Пример:{
Модуль: HSGdi
Описание: Интерфейс к недокументрованным функциям GDI32.
Автор: Игорь Шевченко
Дата создания: 16.10.2002
История изменений:
}
unit HSGdi;
interface
uses
Windows;
type
TSizeRect = packed record
case Integer of
0: (Left, Top, Width, Height: Longint);
1: (TopLeft : TPoint; RectSize : SIZE);
end;
{ Элемент данных для PolyPatBlt }
TPatRect = packed record
R : TSizeRect; { Координаты и размер области заполнения }
Brush : HBRUSH; { Кисть, которой будет заполнена область }
end;
function PolyPatBlt (DC : HDC; { Контекст устройства }
dwRasterOp : DWORD; { Растровая операция (PATCOPY,
PATINVERT, ect}
Rects : Pointer; { Данные }
dwRectsCount : DWORD; { Количество элементов в PolyData }
dwReserved : DWORD { Назначение параметра неизвестно }
) : Boolean; stdcall;
implementation
uses
SysUtils;
{ Функции }
type
TPolyPatBlt = function (DC : HDC; dwRasterOp : DWORD;
Rects : Pointer; dwRectsCount : DWORD;
dwReserved : DWORD) : Boolean; stdcall;
var
_PolyPatBlt : TPolyPatBlt;
GdiDllHandle: THandle;
const
GdiDllname = "gdi32.dll";
function InitGDI : Boolean;
begin
if GdiDllHandle = 0 then
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
GdiDllHandle := GetModuleHandle(GdiDllname);
if GdiDllHandle <> 0 then begin
@_PolyPatBlt := GetProcAddress(GdiDllHandle, "PolyPatBlt");
end;
end;
Result := (GdiDllHandle <> 0);
end;
function GdiNotImplemented : Boolean;
begin
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Result := false;
end;
function PolyPatBlt (DC : HDC;
dwRasterOp : DWORD;
Rects : Pointer;
dwRectsCount : DWORD;
dwReserved : DWORD) : Boolean;
begin
if InitGDI AND Assigned(_PolyPatBlt) then
Result := _PolyPatBlt(DC, dwRasterOp, Rects, dwRectsCount, dwReserved)
else
Result := GdiNotImplemented;
end;
end.
Reindeer Moss Eater (2002-11-20 10:57:00) [2]FileExists это лишнее.
Skier (2002-11-20 10:55:00) [3]>Eugenex
1) LoadLibrary + FreeLibrary (Динамический импорт)
2) FileExists(...)
Reindeer Moss Eater (2002-11-20 10:51:00) [4]Динамический импорт vs статический