- •Содержание задания
- •Индивидуальные варианты заданий (обираемая информация о компьютере)
- •Возможный вид главной формы программы-инсталлятора
- •Возможный вид дополнительной формы основной программы
- •Рекомендуемые средства языка программирования c#
- •Рекомендуемые для разработки программы средства языка 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;
Рекомендуемые для разработки программы средства языка Си++ и систем C++ Builder и Visual C++
Сбор информации о компьютере:
// получение в буфере lpBuffer длины nSize имени пользователя текущего сеанса
BOOL GetUserName(LPTSTR lpBuffer, LPDWORD nSize);
/* получение имени компьютера в буфере lpBuffer длины nSize>= MAX_COMPUTERNAME_LENGTH+1 */
BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD nSize);
/* получение в буфере lpBuffer длины uSize >= MAX_PATH пути к каталогу с ОС Windows */
UINT GetWindowsDirectory(LPTSTR lpBuffer,UINT uSize);
/* получение в буфере lpBuffer длины uSize >= MAX_PATH пути к системному каталогу Windows */
UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize);
// получение типа (nTypeFlag=0) или подтипа (nTypeFlag=1) клавиатуры
int GetKeyboardType(int nTypeFlag);
/* получение количества кнопок мыши (nIndex=SM_CMOUSEBUTTONS), ширины (nIndex=SM_CXSCREEN) или высоты (nIndex=SM_CYSCREEN) экрана */
int GetSystemMetrics(int nIndex);
/* получение в буфере lpBuffer длины nBufferLength строки с корневыми каталогами всех дисков, разделенных 0-символами; результат – длина полученной строки без заключительного 0-символа */
DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer);
/* получение в буфере *lpBuffer структуры типа MEMORYSTATUS с характеристиками памяти компьютера (поле dwTotalPhys содержит целое число, равное общему объему физической памяти в байтах) */
VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
/* получение информации об объеме текущего диска (lpRootPathName=NULL): количестве секторов в кластере (lpSectorsPerCluster), размере сектора (lpBytesPerSector), общем количестве кластеров (lpTotalNumberOfClusters), lpNumberOfFreeClusters=NULL */
BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);
/* получение информации о текущем диске (lpRootPathName=NULL): метке тома (в буфере lpVolumeNameBuffer длины nVolumeNameSize), серийном номере (в переменной *lpVolumeSerialNumber), файловой системе (в буфере lpFileSystemNameBuffer длины nFileSystemNameSize), lpMaximumComponentLength=NULL, lpFileSystemFlags=NULL */
BOOL GetVolumeInformation(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize);
Получение и проверка электронной цифровой подписи (ЭЦП) (константы, типы данных и прототипы функций определены в файле wincrypt.h):
HCRYPTPROV, HCRYPTKEY, HCRYPTHASH – типы данных для дескрипторов криптопровайдера (CSP), криптографического ключа, хеш-объекта
ALG_ID – тип данных для кодов криптографических алгоритмов
/* инициализация криптопровайдера: в *phProv записывается его дескриптор,
pszContainer=NULL, pszProvider=NULL, dwProvType=PROV_RSA_FULL,
dwFlags=0 или (если при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере dwFlags= CRYPT_NEWKEYSET */
BOOL CryptAcquireContext(HCRYPTPROV *phProv, LPCSTR pszContainer,
LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags);
/* создание в криптопровайдере с дескриптором hProv пары ключей ЭЦП (Algid=AT_SIGNATURE, dwFlags=0) и запись дескриптора открытого ключа в *phKey */
BOOL CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid,
DWORD dwFlags, HCRYPTKEY *phKey);
/* получение у криптопровайдера с дескриптором hProv дескриптора открытого ключа ЭЦП (dwKeySpec=AT_SIGNATURE) в переменной *phUserKey (если функция возвращает FALSE, то пару ключей ЭЦП нужно создать с помощью функции CryptGenKey) */
BOOL CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec,
HCRYPTKEY *phUserKey);
/* создание пустого хеш-объекта (hProv – дескриптор инициализированного криптопровайдера, Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в *phHash записывается дескриптор хеш-объекта) */
BOOL CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid,
HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash);
/* добавление в хеш-объект данных из буфера *pbData длины dwDataLen (hHash – дескриптор хеш-объекта, dwFlags=0) */
BOOL CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData,
DWORD dwDataLen, DWORD dwFlags);
/* получение для хеш-объекта с дескриптором hHash ЭЦП в буфере pbSignature длины *pdwSigLen (после выполнения функции в эту переменную записывается фактическая длина ЭЦП); dwKeySpec=AT_SIGNATURE, sDescription=NULL, dwFlags=0 */
BOOL CryptSignHash(HCRYPTHASH hHash, DWORD dwKeySpec,
LPCTSTR sDescription, DWORD dwFlags, BYTE *pbSignature,
DWORD *pdwSigLen);
/* проверка ЭЦП из буфера *pbSignature длины dwSigLen для хеш-объекта с дескриптором hHash с помощью открытого ключа hPubKey (sDescription=NULL, dwFlags=0) */
BOOL CryptVerifySignature(HCRYPTHASH hHash, BYTE *pbSignature,
DWORD dwSigLen, HCRYPTKEY hPubKey, LPCTSTR sDescription,
DWORD dwFlags);
// разрушение хеш-объекта с дескриптором hHash
BOOL CryptDestroyHash(HCRYPTHASH hHash);
// разрушение ключа шифрования с дескриптором hKey
BOOL CryptDestroyKey(HCRYPTKEY hKey);
// освобождение криптопровайдера с дескриптором hProv (dwFlags=0)
BOOL CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags);
Работа с реестром Windows в C++ Builder:
Класс TRegistry (определен в файле vcl\registry.hpp):
конструктор без параметров;
свойства:
HKEY RootKey (корневой раздел реестра, по умолчанию HKEY_CURRENT_USER);
HKEY CurrentKey (текущий раздел реестра, только для чтения);
AnsiString CurrentPath (путь к текущему разделу реестра, только для чтения).
методы:
/* открытие или (если CanCreate=true) при необходимости создание текущего раздела реестра Key */
bool OpenKey(const AnsiString Key, bool CanCreate);
/* запись (перезапись) в текущий раздел реестра значения параметра Name из буфера Buffer длины BufSize */
void WriteBinaryData(const AnsiString Name, void *Buffer, int BufSize);
// запись и закрытие текущего раздела реестра
void CloseKey();
// проверка существования в реестре раздела Key
bool KeyExists(const AnsiString Key);
/* чтение из текущего раздела реестра значения параметра Name в буфер Buffer длины BufSize */
int ReadBinaryData(const AnsiString Name, void *Buffer, int BufSize);
Работа с реестром Windows в Visual C++:
Класс CWinApp:
поля:
LPCTSTR m_pszRegistryKey (текущий раздел реестра, предназначенный для хранения настроек приложения, по умолчанию внутри НКЕУ_CURRENT_USER\Software)
LPCTSTR m_pszProfileName (имя подраздела реестра внутри текущего раздела, по умолчанию совпадает с именем приложения)
методы:
/* запись в раздел lpszSection (внутри текущий раздел \ имя подраздела) параметра lpszEntry из буфера pData длины nBytes */
BOOL WriteProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes);
/* чтение значения параметра lpszEntry из раздела lpszSection (внутри текущий раздел \ имя подраздела) в буфер *ppData длины *pBytes */
BOOL GetProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE *ppData, UINT *pBytes);
/* Функция для выделения памяти под значение поля класса CWinApp при его изменении (создание дубликата строки strSource для возможности его освобождения деструктором класса) */
wchar_t *_wcsdup( const wchar_t *strSource);
Отображение системного диалога для выбора папки (при установке программы) и получение полного пути к выбранной пользователем папке. Требуется подключение файла shlobj.h.
/* отображение системного диалога; структура *lpbi содержит информацию для настройки диалога: функция возвращает указатель на созданный элемент, хранящий размещение выбранной пользователем папки; при отказе пользователя от выбора функция возвращает NULL */
LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi);
// вариант предыдущей функции для Microsoft Visual Studio
PIDLIST_ABSOLUTE SHBrowseForFolder(LPBROWSEINFO lpbi);
/* преобразование размещения папки pidl, полученного с помощью функции SHBrowseForFolder, в полный путь к этой паке в буфере pszPath длиной не менее MAX_PATH байт */
BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl, LPSTR pszPath);
// вариант предыдущей функции для Microsoft Visual Studio
BOOL SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl, LPTSTR pszPath);
/* освобождение памяти, выделенной при выполнении функции SHBrowseForFolder, указатель на которую данная функция возвратила в качестве результата */
HLOCAL LocalFree(HLOCAL hMem);
void CoTaskMemFree(LPVOID pv);