Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 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, файл иконки необязательно таскать с собой. Её можно брать у винды. Посмотри в примере "Создание кастомного диалогового окна", в шапке.

Последний раз редактировалось Johny777, 15-08-2013 в 00:37.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:29, 15-08-2013 | #1022