Ветеран
Сообщения: 649
Благодарности: 444
|
Профиль
|
Отправить PM
| Цитировать
volga163@vk, сделал
читать дальше »
Код: 
[Files]
Source: config.ini; DestDir:{app}; Check: INI_InDestFolder();
[code ]
#define A = (Defined UNICODE) ? "W" : "A"
const
TEST_REG_SUB_KEY = 'Control Panel\My App\Test';
TEST_INI_FILE_NAME = 'config.ini';
TEST_REG_VALUE_NAME = 'ID';
TEST_REG_VALUE = 'ID';
///////////////////////////////////////
const
ERROR_SUCCESS = 0;
STANDARD_RIGHTS_ALL = $001F0000;
KEY_QUERY_VALUE = $0001;
KEY_SET_VALUE = $0002;
KEY_CREATE_SUB_KEY = $0004;
KEY_ENUMERATE_SUB_KEYS = $0008;
KEY_NOTIFY = $0010;
KEY_CREATE_LINK = $0020;
SYNCHRONIZE = $00100000;
KEY_ALL_ACCESS = (STANDARD_RIGHTS_ALL or KEY_QUERY_VALUE or KEY_SET_VALUE or KEY_CREATE_SUB_KEY or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY or KEY_CREATE_LINK) and not SYNCHRONIZE;
READ_CONTROL = $00020000;
STANDARD_RIGHTS_READ = READ_CONTROL;
KEY_READ = (STANDARD_RIGHTS_READ or KEY_QUERY_VALUE or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY) and not SYNCHRONIZE;
REG_EXPAND_SZ = 2;
SINGLE_CHAR_SIZE = 2;
type
ACCESS_MASK = DWORD;
REGSAM = ACCESS_MASK;
HKEY = LongWord;
Pointer = Longint;
PByte = Pointer;
PDWORD = Pointer;
function RegCreateKeyEx(hKey: HKEY; lpSubKey: String; Reserved: DWORD; lpClass: String; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: Longint;
var phkResult: HKEY; var lpdwDisposition: DWORD): Longint; external 'RegCreateKeyEx{#A}@advapi32.dll stdcall';
function RegSetValueEx(hKey: HKEY; lpValueName: String; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD): Longint; external 'RegSetValueEx{#A}@advapi32.dll stdcall';
function RegCloseKey(hKey: HKEY): Longint; external 'RegCloseKey@advapi32.dll stdcall';
function RegOpenKeyEx(hKey: HKEY; lpSubKey: String; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; external 'RegOpenKeyEx{#A}@advapi32.dll stdcall';
function RegQueryValueEx(hKey: HKEY; lpValueName: String; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD): Longint; external 'RegQueryValueEx{#A}@advapi32.dll stdcall';
function CreateRegKey(const hKey: HKEY; const lpSubKey: String; out phkResult: HKEY): Boolean; // phkResult - хэндл открытого ключа. Нам он пригодится
var
lpdwDisposition: DWORD;
begin
Result := RegCreateKeyEx(hKey, lpSubKey, 0, '', 0, KEY_ALL_ACCESS, 0, phkResult, lpdwDisposition) = ERROR_SUCCESS;
end;
function hSetRegExpandStringValue(const hKeyOpened: HKEY; const ValueName, Value: String): Boolean; // сюда в hKeyOpened отправляем открытый хэндл, чтоб не открывать новый
begin
Result := RegSetValueEx(hKeyOpened, ValueName, 0, REG_EXPAND_SZ, CastStringToInteger(Value), (Length(Value) + 1) * SINGLE_CHAR_SIZE) = ERROR_SUCCESS;
end;
function WinApi_RegKeyExists(const hKey: HKEY; const lpSubKey: String): Boolean;
var
phkResult: HKEY;
begin
Result := RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS;
if Result then RegCloseKey(phkResult);
end;
function WinApi_RegKeyValueExists(const hKey: HKEY; const lpSubKey, lpValueName: String): Boolean;
var
phkResult: HKEY;
begin
if RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS then
try
Result := RegQueryValueEx(phkResult, lpValueName, 0, 0, 0, 0) = ERROR_SUCCESS;
finally
RegCloseKey(phkResult);
end;
end;
function INI_InDestFolder(): Boolean;
var
hKeyOpened: DWORD;
begin
Result := not FileExists( AddBackslash( ExpandConstant('{app}') ) + TEST_INI_FILE_NAME ); // файл будет установлен, если его нет в директории установки
// если нет ветки Control Panel\My App\Test' (убрал под константу TEST_REG_SUB_KEY), в разделе HKEY_CURRENT_USER то создаём её
if not WinApi_RegKeyExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY) then
begin
CreateRegKey(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, hKeyOpened); // создаём ветку
hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // те ветки не было то не было и ключа, создаём и его
end else // в противном случае если ветка есль, то проверям наличие там ключа
if not WinApi_RegKeyValueExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, TEST_REG_VALUE_NAME) then //если ключа нет
Result := hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // то создаём его
end;
работа с реестром здесь на чистом WinApi (!)
Тестируй!
=================================================================
nik1967, файл иконки необязательно таскать с собой. Её можно брать у винды. Посмотри в примере "Создание кастомного диалогового окна", в шапке.
|