
- •Содержание задания
- •Индивидуальные варианты заданий (обираемая информация о компьютере)
- •Возможный вид главной формы программы-инсталлятора
- •Возможный вид дополнительной диалоговой формы основной программы
- •Классы библиотеки Framework Class Library и объекты для использования в приложениях на платформе .Net
- •Рекомендуемые для разработки программы средства языка Object Pascal
Рекомендуемые для разработки программы средства языка Object Pascal
Сбор информации о компьютере:
// получение в буфере lpBuffer длины nSize имени пользователя текущего сеанса
function GetUserName(lpBuffer: PChar; var nSize: DWORD): BOOL;
{ получение имени компьютера в буфере lpBuffer длины nSize>= MAX_COMPUTERNAME_LENGTH+1 }
function GetComputerName(lpBuffer: PChar; var nSize: DWORD): BOOL;
{ получение в буфере lpBuffer длины uSize >= MAX_PATH пути к каталогу с ОС Windows }
function GetWindowsDirectory(lpBuffer: PChar; uSize: UINT): UINT;
{ получение в буфере lpBuffer длины uSize >= MAX_PATH пути к системному каталогу Windows }
function GetSystemDirectory(lpBuffer: PChar; uSize: UINT): UINT;
// получение типа (nTypeFlag=0) или подтипа (nTypeFlag=1) клавиатуры
function GetKeyboardType(nTypeFlag: Integer): Integer;
{ получение количества кнопок мыши (nIndex=SM_CMOUSEBUTTONS), ширины (nIndex=SM_CXSCREEN) или высоты (nIndex=SM_CYSCREEN) экрана }
function GetSystemMetrics(nIndex: Integer): Integer;
{ получение в буфере lpBuffer длины nBufferLength строки с корневыми каталогами всех дисков, разделенных 0-символами; результат – длина полученной строки без заключительного 0-символа }
function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: PAnsiChar): DWORD;
{ получение в буфере *lpBuffer структуры типа MEMORYSTATUS с характеристиками памяти компьютера (поле dwTotalPhys содержит целое число, равное общему объему физической памяти в байтах) }
procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus);
{ получение информации об объеме текущего диска (lpRootPathName=NULL): количестве секторов в кластере (lpSectorsPerCluster), размере сектора (lpBytesPerSector), общем количестве кластеров (lpTotalNumberOfClusters), lpNumberOfFreeClusters=NULL }
function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL;
{ получение информации о текущем диске (lpRootPathName=NULL): метке тома (в буфере lpVolumeNameBuffer длины nVolumeNameSize), серийном номере (в переменной lpVolumeSerialNumber), файловой системе (в буфере lpFileSystemNameBuffer длины nFileSystemNameSize), lpMaximumComponentLength=NULL, lpFileSystemFlags=NULL }
function GetVolumeInformation(lpRootPathName: PChar;
lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL;
Получение и проверка электронной цифровой подписи (ЭЦП) (константы, типы данных и прототипы функций определены в файле wincrypt.pas):
THandle – тип данных для дескрипторов криптопровайдера, криптографического ключа, хеш-объекта
ALG_ID – тип данных для кодов криптографических алгоритмов
{ инициализация криптопровайдера: в *phProv записывается его дескриптор,
pszContainer=NULL, pszProvider=NULL, dwProvType=PROV_RSA_FULL,
dwFlags=0 или (если при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере dwFlags= CRYPT_NEWKEYSET }
function CryptAcquireContext(var hProv:THandle;pszContainer,pszProvider:PChar;
dwProvType,dwFlags:Longint):Longbool;
{ создание в криптопровайдере с дескриптором hProv пары ключей ЭЦП (Algid=AT_SIGNATURE, dwFlags=0) и запись дескриптора открытого ключа в *phKey }
function CryptGenKey(hProv:THandle; Algid:ALG_ID; dwFlags:Longint; var phKey:THandle):Longbool;
{ получение у криптопровайдера с дескриптором hProv дескриптора открытого ключа ЭЦП (dwKeySpec=AT_SIGNATURE) в переменной *phUserKey (если функция возвращает FALSE, то пару ключей ЭЦП нужно создать с помощью функции CryptGenKey) }
function CryptGetUserKey(hProv:THandle; dwKeySpec:Longint; var phUserKey:THandle):Longbool;
{ создание пустого хеш-объекта (hProv – дескриптор инициализированного криптопровайдера, Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в *phHash записывается дескриптор хеш-объекта) }
function CryptCreateHash(hProv:THandle; Algid:ALG_ID; hKey:THandle; dwFlags:Longint; var hHash:THandle):Longbool;
{ добавление в хеш-объект данных из буфера *pbData длины dwDataLen (hHash – дескриптор хеш-объекта, dwFlags=0) }
function CryptHashData(hHash:THandle; pbData:Pointer; dwDataLen,dwFlags: Longint): Longbool;
{ получение для хеш-объекта с дескриптором hHash ЭЦП в буфере pbSignature длины *pdwSigLen (после выполнения функции в эту переменную записывается фактическая длина ЭЦП); dwKeySpec=AT_SIGNATURE, sDescription=NULL, dwFlags=0 }
function CryptSignHash(hHash:THandle; dwKeySpec:Longint; sDescription:PChar; dwFlags:Longint; pbSignature: Pointer; var pdwSigLen: Longint): Longbool;
{ проверка ЭЦП из буфера *pbSignature длины dwSigLen для хеш-объекта с дескриптором hHash с помощью открытого ключа hPubKey (sDescription=NULL, dwFlags=0) }
function CryptVerifySignature(hHash:THandle; pbSignature:Pointer; dwSigLen:Longint; hPubKey:THandle; sDescription:PChar; dwFlags:Longint): Longbool;
// разрушение хеш-объекта с дескриптором hHash
function CryptDestroyHash(hHash:THandle):Longbool;
// разрушение ключа шифрования с дескриптором hKey
function CryptDestroyKey(hKey:THandle):Longbool;
// освобождение криптопровайдера с дескриптором hProv (dwFlags=0)
function CryptReleaseContext(hProv:THandle;dwFlags:Longint):Longbool;
Работа с реестром Windows:
Класс TRegistry (определен в модуле registry):
конструктор без параметров;
свойства:
RootKey: HKEY (корневой раздел реестра, по умолчанию HKEY_CURRENT_USER);
CurrentKey: HKEY(текущий раздел реестра, только для чтения);
CurrentPath: string(путь к текущему разделу реестра, только для чтения).
методы:
{ открытие или (если CanCreate=true) при необходимости создание текущего раздела реестра Key }
function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
{ запись (перезапись) в текущий раздел реестра значения параметра Name из буфера Buffer длины BufSize }
procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
// запись и закрытие текущего раздела реестра
procedure CloseKey;
// проверка существования в реестре раздела Key
function KeyExists(const Key: string): Boolean;
{ чтение из текущего раздела реестра значения параметра Name в буфер Buffer длины BufSize }
function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
Отображение системного диалога для выбора папки (при установке программы) и получение полного пути к выбранной пользователем папке. Требуется подключение модуля Shlobj.
{ отображение системного диалога; структура lpbi содержит информацию для настройки диалога: функция возвращает указатель на созданный элемент, хранящий размещение выбранной пользователем папки; при отказе пользователя от выбора функция возвращает NULL }
function SHBrowseForFolder(var lpbi: TBrowseInfo): PItemIDList;
{ преобразование размещения папки pidl, полученного с помощью функции SHBrowseForFolder, в полный путь к этой паке в буфере pszPath длиной не менее MAX_PATH байт }
function SHGetPathFromIDList(pidl: PItemIDList; pszPath: PChar): BOOL;
{ освобождение памяти, выделенной при выполнении функции SHBrowseForFolder, указатель на которую данная функция возвратила в качестве результата }
function LocalFree(hMem: HLOCAL): HLOCAL;