Windows
У вас есть исходный код VCL? Если да, то в этом случае ее можно всю перекомпилировать, добавив каталог к вашему библиотечному пути (Library path) в опциях среды (Environment Options | Library). Я думаю это нужно сделать, чтобы отделаться от этой ошибки. При другом способе необходимо вычислить вызывающую проблему директиву $R, временно удалить ее, и осуществить перекомпиляцию. Временно выключить директиву $R можно добавлением '.' перед $ (но это не единственный путь выключить ее).
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Если у вас есть исходный файл (.радиоуправляемый), то вы можете просто перекомпилировать .RC файл в a .файл РЭС с использованием Борланд компилятор командной строки ресурсов (brcc32.exe-файл), расположенный в Делфи/с++ Строителей bin директории. Если только есть .res-файл, чтобы работать с, необходимо использовать качественный компилятор ресурсов/декомпилятор ресурсов, таких как Мастерская Borland для. Версии Borland Resource Workshop позже 4.5 могут извлекать, компилировать и декомпилировать как 16, так и 32-разрядные файлы ресурсов из различных источников, включая .РЭС. ,исполняемый. ,библиотеки dll, drv, а .cpl файлы. Программе Borland версии семинара ресурса 4.5 судно с Борланд рад обновления линейки продуктов
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Иногда возникает необходимость вшить ресурсы в исполняемый файл Вашего приложения (например чтобы предотвратить их случайное удаление пользователем, либо, чтобы защитить их от изменений). Данный пример показывает как вшить любой файл как ресурс в EXE-шнике.
Далее рассмотрим, как создать файл ресурсов, содержащий корию какого-либо файла. После создания такого файла его можно легко прицепить к Вашему проекту директивой {$R}. Файл ресурсов, который мы будем создавать имеет следующий формат:
+ заголовок
+ заголовок для нашего RCDATA ресурса
+ собственно данные - RCDATA ресурс
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Сохранить файл в ресурсе программы на этапе компилляции можно выполнив следующие шаги:
1) Поставить себе RxLib
2) Появится в меню "Project" дополнительный пункт меню "Resources"
3) Открой его , создай новый ресурс "User Data", в него загрузи нужный файл, измени имя ресурса на что-нибудь типа 'MyResName'.
Теперь при компилляции проэкта в exe файл будет прикомпиллирован ваш файл в виде ресурса. Извлечь его на этапе выполнения можно следующим образом:
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Таблицы строк
Ресурсы в виде таблиц строк (Stringtable) являются очень полезным подспорьем, когда ваше приложение должно хранить большое количество строк для их вывода во время выполнения приложения. Вы должны побороть искушение непосредственной вставки строк в вашу программу, поскольку использование таблиц строк имеет два неоспоримых преимущества:
1) Строки, хранимые в ресурсах, не занимают память до тех пор, пока они не будут загружены вашим приложением.
2) Stringtables легко редактировать, создавая таким образом локализованные (переведенные) версии вашего приложения.
Таблицы строк компилируются в ".res"-файл, который включается в exe-файл приложения во время сборки. Даже после того, как вы распространите ваше приложение, таблицы строк, содержащиеся в вашем приложении могут редактироваться редактором ресурсов. Моим любимым редактором ресурсов является Borland Resource Workshop, поставляемый в комплекте с Delphi. Он позволяет в режиме WYSIWYG редактировать как 16-, так и 32-битные ресурсы, как автономные, так и имплантированные в exe или dll-файлы. Тем более это удобно, если учесть что вместе со всеми версиями Delphi поставляется компилятор
ресурсов из командной строки (Borland Resource Command Line Compiler) (BRCC.EXE и BRCC32.EXE), расположенный в Delphi-директории Bin.
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
FindResource + LoadResource + LockResource
Определяем размеры картинки хранящейся в ресурсах:
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Вы можете включить любой тип данных как RCDATA или пользовательских тип ресурса. Это очень просто. Данный совет покажет вам общую технику создания такого ресурса.
Code: |
Type TStrItem = String[39]; { 39 символов + байт длины -> 40 байтов } TDataArray = Array [0..7, 0..24] of TStrItem;
Const Data: TDataArray = ( ('..', ...., '..' ), { 25 строк на строку } ... { 8 таких строк } ('..', ...., '..' )); { 25 строк на строку } |
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Данный метод обходит проблемы, связанные с Image Editor.
В каталоге \DELPHI\BIN имеется утилита коммандной строки, названная BRCC.EXE, позволяющая создавать из файлов, содержащих изображения/иконки, RES-файлы, в обход Image Editor. (Тем не менее, Image Editor хорошо работает при создании или редактировании файлов с изображениями или курсорами. Проблемой был импорт.)
Resource File Compiler описан в справке Windows API help в главе Windows Tools (где вы также можете прочесть о RC.EXE как о BRCC.EXE!). Это сэкономит вам какое-то время!
Сначала, используя Блокнот, создайте файл определения ресурса (Resource Definition) (текстовый) с именем, скажем, MYRES.RC (с обязательным расширением RC). Разместите, каждую на отдельной строке, ссылки на изображения, иконки, и т.п., которые вы хотели бы включить в RES-файл, например:
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Вот небольшой пример работы с системным реестром;
Code: |
uses Registry, Windows;
procedure TForm1.Button1Click(Sender: TObject); var Registry: TRegistry; begin { создаём объект TRegistry } Registry := TRegistry.Create; { устанавливаем корневой ключ; напрмер hkey_local_machine или hkey_current_user } Registry.RootKey := hkey_local_machine; { открываем и создаём ключ } Registry.OpenKey('software\MyRegistryExample',true); { записываем значение } Registry.WriteString('MyRegistryName','MyRegistry Value'); { закрываем и освобождаем ключ } Registry.CloseKey; Registry.Free; end;
// для удаления ключа используется функция Registry.DeleteKey |
- Подробности
- Родительская категория: Реестр
- Категория: Общие принципы работы с реестром
Вы можете использовать Борланд компилятор командной строки ресурсов (BRCC.EXE и BRCC32.EXE), который поставляется с Delphi и C++ Builder, или в WYSIWYG редактор ресурсов, например ресурсов Борланд Мастерская 5.0, который поставляется с Борланд рад пакета. Ресурс мастерской 5.0 можно скомпилировать и декомпилировать как в 16, так и 32-битные ресурсы .rc, .res, .exe, .dll, .drv, .vbx, .cpl, .ico,. bmp, .rle, .dlg, fnt, cur.
- Подробности
- Родительская категория: Windows
- Категория: Работа с ресурсами
Создать подраздел в реестре:
RegCreateKey (Key:HKey; SubKey: PChar; var Result: HKey): Longint;
Key - указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, а в Delphi3 - все.
SubKey - имя раздела - строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ ...). Если такой раздел уже существует, то он открывается.
В любом случае при успешном вызове Result содержит Handle на раздел.
Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное - ошибка.
Открыть подраздел:
RegOpenKey(Key: HKey; SubKey: PChar; var Result: HKey): Longint;
Раздел Key
Подраздел SubKey
Возвращает Handle на подраздел в переменной Result. Если раздела с таким именем нет, то он не создается.
Возврат - код ошибки или ERROR_SUCCESS, если успешно.
Закрывает раздел:
RegCloseKey(Key: HKey): Longint;
Закрывает раздел, на который ссылается Key.
Возврат - код ошибки или ERROR_SUCCESS, если успешно.
Удалить подраздел:
RegDeleteKey(Key: HKey; SubKey: PChar): Longint;
Удалить подраздел Key\SubKey.
Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
Получить имена всех подразделов раздела Key:
RegEnumKey(Key:HKey; index: Longint; Buffer: PChar; cb: Longint): Longint;
Key - Handle на открытый или созданный раздел
Buffer - указатель на буфер
cb - размер буфера
index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой
Возвращает текстовую строку, связанную с ключом Key\SubKey:
RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint;
Ключ\подключ Key\SubKey.
Value - буфер для строки
cb - размер, на входе - размер буфера, на выходе - длина возвращаемой строки.
Возврат - код ошибки.
Задать новое значение ключу Key\SubKey:
RegSetValue(Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar; cb: Longint): Longint;
Ключ\подключ Key\SubKey.
ValType - тип задаваемой переменной,
Value - буфер для переменной
cb - размер буфера. В Windows 3.1 допустимо только Value=REG_SZ.
Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
Удаляет значение lpValueName находящееся в ключе hKey:
RegDeleteValue(HKEY hKey, LPCTSTR lpValueName);
hKey - ключ. hKey должен был быть открыт с доступом KEY_SET_VALUE процедурой RegOpenKey.
lpValueName - значение, находящееся в ключе hKey.
Возвращает ERROR_SUCCESS если успешно.
Выдает список значений у ключа hKey:
LONG RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
hKey - ключ.
dwIndex - этот параметр должен быть 0 при первом вызове, а далее по анологии с RegEnumKey (т.е. можно использовать в цикле),
lpValueName - буфер для названия значения
lpcbValueName - размер lpValueName
lpReserved должно быть всегда 0
lpType - буфер для названия типа (int)
lpData - буфер для данных
lpcbData-размер для lpData
Примечание:
При каждой новом вызове функции после предыдущего нужно заново переназначить lpcbValueName.
lpcbValueName = sizeof(lpValueName)
Примеры:
Code: |
{ Создаем список всех подразделов указанного раздела } procedure TForm1.Button1Click(Sender: TObject); var MyKey: HKey; { Handle для работы с разделом } Buffer: array[0 .. 1000] of char; { Буфер } Err, { Код ошибки } index: longint; { Индекс подраздела } begin Err := RegOpenKey(HKEY_CLASSES_ROOT, 'DelphiUnit', MyKey); { Открыли раздел } if Err <> ERROR_SUCCESS then begin MessageDlg('Нет такого раздела !!', mtError, [mbOk], 0); exit; end; index := 0; {Определили имя первого подраздела } Err := RegEnumKey(MyKey, index, Buffer, Sizeof(Buffer)); while err = ERROR_SUCCESS do { Цикл, пока есть подразделы } begin memo1.lines.add(StrPas(Buffer)); { Добавим имя подраздела в список } inc(index); { Увеличим номер подраздела } Err := RegEnumKey(MyKey, index, Buffer, Sizeof(Buffer)); { Запрос } end; RegCloseKey(MyKey); { Закрыли подраздел } end; |
Взято с https://delphiworld.narod.ru
Реестр предназначен для хранения системных переменных и позволяет зарегистрировать файлы программы, что обеспечивает их показ в проводнике с соответствующей иконкой, вызов программы при щелчке на этом файле, добавление ряда команд в меню, вызываемое при нажатии правой кнопки мыши над файлом. Кроме того, в реестр можно внести некую свою информацию (переменные, константы, данные о инсталлированной программы ...). Программу можно добавить в список деинсталляции, что позволит удалить ее из менеджера "Установка/Удаление программ" панели управления.
Для работы с реестром применяется ряд функций API :
RegCreateKey (Key: HKey; SubKey: PChar; var Result: HKey): Longint;
Создать подраздел в реестре. Key указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, в в Delphi3 - все. SubKey - имя раздела - строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ ...). Если такой раздел уже существует, то он открывается (в любом случае при успешном вызове Result содержит Handle на раздел). Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное - ошибка.
RegOpenKey(Key: HKey; SubKey: PChar; var Result: HKey): Longint;
Открыть подраздел Key\SubKey и возвращает Handle на него в переменной Result. Если раздела с таким именем нет, то он не создается. Возврат - код ошибки или ERROR_SUCCESS, если успешно.
RegCloseKey(Key: HKey): Longint;
Закрывает раздел, на который ссылается Key. Возврат - код ошибки или ERROR_SUCCESS, если успешно.
RegDeleteKey(Key: HKey; SubKey: PChar): Longint;
Удалить подраздел Key\SubKey. Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
RegEnumKey(Key: HKey; index: Longint; Buffer: PChar;cb: Longint): Longint;
Получить имена всех подразделов раздела Key, где Key - Handle на открытый или созданный раздел (см. RegCreateKey и RegOpenKey), Buffer - указатель на буфер, cb - размер буфера, index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой (см. пример).
RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint;
Возвращает текстовую строку, связанную с ключом Key\SubKey.Value - буфер для строки; cb- размер, на входе - размер буфера, на выходе - длина возвращаемой строки. Возврат - код ошибки.
RegSetValue(Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar; cb: Longint): Longint;
Задать новое значение ключу Key\SubKey, ValType - тип задаваемой переменной, Value - буфер для переменной, cb - размер буфера. В Windows 3.1 допустимо только Value=REG_SZ. Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
Примеры :
Code: |
{ Создаем список всех подразделов указанного раздела } procedure TForm1.Button1Click(Sender: TObject); var MyKey : HKey; { Handle для работы с разделом } Buffer : array[0..1000] of char; { Буфер } Err, { Код ошибки } index : longint; { Индекс подраздела } begin Err:=RegOpenKey(HKEY_CLASSES_ROOT,'DelphiUnit',MyKey); { Открыли раздел } if Err<> ERROR_SUCCESS then begin MessageDlg('Нет такого раздела !!',mtError,[mbOk],0); exit; end; index:=0; {Определили имя первого подраздела } Err:=RegEnumKey(MyKey,index,Buffer,Sizeof(Buffer)); while err=ERROR_SUCCESS do { Цикл, пока есть подразделы } begin memo1.lines.add(StrPas(Buffer)); { Добавим имя подраздела в список } inc(index); { Увеличим номер подраздела } Err:=RegEnumKey(MyKey,index,Buffer,Sizeof(Buffer)); { Запрос } end; RegCloseKey(MyKey); { Закрыли подраздел } end; |
Источник: https://dmitry9.nm.ru/info/
Автор: i-s-v
Code: |
unit apiregistry;
interface
uses Windows;
function RegSetString(RootKey: HKEY; Name: string; Value: string): boolean; function RegSetMultiString(RootKey: HKEY; Name: string; Value: string): boolean; function RegSetExpandString(RootKey: HKEY; Name: string; Value: string): boolean; function RegSetDWORD(RootKey: HKEY; Name: string; Value: Cardinal): boolean; function RegSetBinary(RootKey: HKEY; Name: string; Value: array of Byte): boolean; function RegGetString(RootKey: HKEY; Name: string; var Value: string): boolean; function RegGetMultiString(RootKey: HKEY; Name: string; var Value: string): boolean; function RegGetExpandString(RootKey: HKEY; Name: string; var Value: string): boolean; function RegGetDWORD(RootKey: HKEY; Name: string; var Value: Cardinal): boolean; function RegGetBinary(RootKey: HKEY; Name: string; var Value: string): boolean; function RegGetValueType(RootKey: HKEY; Name: string; var Value: Cardinal): boolean; function RegValueExists(RootKey: HKEY; Name: string): boolean; function RegKeyExists(RootKey: HKEY; Name: string): boolean; function RegDelValue(RootKey: HKEY; Name: string): boolean; function RegDelKey(RootKey: HKEY; Name: string): boolean; function RegConnect(MachineName: string; RootKey: HKEY; var RemoteKey: HKEY): boolean; function RegDisconnect(RemoteKey: HKEY): boolean; function RegEnumKeys(RootKey: HKEY; Name: string; var KeyList: string): boolean; function RegEnumValues(RootKey: HKEY; Name: string; var ValueList: string): boolean;
implementation
function LastPos(Needle: Char; Haystack: string): integer; begin for Result := Length(Haystack) downto 1 do if Haystack[Result] = Needle then Break; end;
function RegConnect(MachineName: string; RootKey: HKEY; var RemoteKey: HKEY): boolean; begin Result := (RegConnectRegistry(PChar(MachineName), RootKey, RemoteKey) = ERROR_SUCCESS); end;
function RegDisconnect(RemoteKey: HKEY): boolean; begin Result := (RegCloseKey(RemoteKey) = ERROR_SUCCESS); end;
function RegSetValue(RootKey: HKEY; Name: string; ValType: Cardinal; PVal: Pointer; ValSize: Cardinal): boolean; var SubKey: string; n: integer; dispo: DWORD; hTemp: HKEY; begin Result := False; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if RegCreateKeyEx(RootKey, PChar(SubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, hTemp, @dispo) = ERROR_SUCCESS then begin SubKey := Copy(Name, n + 1, Length(Name) - n); Result := (RegSetValueEx(hTemp, PChar(SubKey), 0, ValType, PVal, ValSize) = ERROR_SUCCESS); RegCloseKey(hTemp); end; end; end;
function RegGetValue(RootKey: HKEY; Name: string; ValType: Cardinal; var PVal: Pointer; var ValSize: Cardinal): boolean; var SubKey: string; n: integer; MyValType: DWORD; hTemp: HKEY; Buf: Pointer; BufSize: Cardinal; begin Result := False; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin SubKey := Copy(Name, n + 1, Length(Name) - n); if RegQueryValueEx(hTemp, PChar(SubKey), nil, @MyValType, nil, @BufSize) = ERROR_SUCCESS then begin GetMem(Buf, BufSize); if RegQueryValueEx(hTemp, PChar(SubKey), nil, @MyValType, Buf, @BufSize) = ERROR_SUCCESS then begin if ValType = MyValType then begin PVal := Buf; ValSize := BufSize; Result := True; end else begin FreeMem(Buf); end; end else begin FreeMem(Buf); end; end; RegCloseKey(hTemp); end; end; end;
function RegSetString(RootKey: HKEY; Name: string; Value: string): boolean; begin Result := RegSetValue(RootKey, Name, REG_SZ, PChar(Value + #0), Length(Value) + 1); end;
function RegSetMultiString(RootKey: HKEY; Name: string; Value: string): boolean; begin Result := RegSetValue(RootKey, Name, REG_MULTI_SZ, PChar(Value + #0#0), Length(Value) + 2); end;
function RegSetExpandString(RootKey: HKEY; Name: string; Value: string): boolean; begin Result := RegSetValue(RootKey, Name, REG_EXPAND_SZ, PChar(Value + #0), Length(Value) + 1); end;
function RegSetDword(RootKey: HKEY; Name: string; Value: Cardinal): boolean; begin Result := RegSetValue(RootKey, Name, REG_DWORD, @Value, SizeOf(Cardinal)); end;
function RegSetBinary(RootKey: HKEY; Name: string; Value: array of Byte): boolean; begin Result := RegSetValue(RootKey, Name, REG_BINARY, @Value[Low(Value)], length(Value)); end;
function RegGetString(RootKey: HKEY; Name: string; var Value: string): boolean; var Buf: Pointer; BufSize: Cardinal; begin Result := False; if RegGetValue(RootKey, Name, REG_SZ, Buf, BufSize) then begin Dec(BufSize); SetLength(Value, BufSize); if BufSize > 0 then CopyMemory(@Value[1], Buf, BufSize); FreeMem(Buf); Result := True; end; end;
function RegGetMultiString(RootKey: HKEY; Name: string; var Value: string): boolean; var Buf: Pointer; BufSize: Cardinal; begin Result := False; if RegGetValue(RootKey, Name, REG_MULTI_SZ, Buf, BufSize) then begin Dec(BufSize); SetLength(Value, BufSize); if BufSize > 0 then CopyMemory(@Value[1], Buf, BufSize); FreeMem(Buf); Result := True; end; end;
function RegGetExpandString(RootKey: HKEY; Name: string; var Value: string): boolean; var Buf: Pointer; BufSize: Cardinal; begin Result := False; if RegGetValue(RootKey, Name, REG_EXPAND_SZ, Buf, BufSize) then begin Dec(BufSize); SetLength(Value, BufSize); if BufSize > 0 then CopyMemory(@Value[1], Buf, BufSize); FreeMem(Buf); Result := True; end; end;
function RegGetDWORD(RootKey: HKEY; Name: string; var Value: Cardinal): boolean; var Buf: Pointer; BufSize: Cardinal; begin Result := False; if RegGetValue(RootKey, Name, REG_DWORD, Buf, BufSize) then begin CopyMemory(@Value, Buf, BufSize); FreeMem(Buf); Result := True; end; end;
function RegGetBinary(RootKey: HKEY; Name: string; var Value: string): boolean; var Buf: Pointer; BufSize: Cardinal; begin Result := False; if RegGetValue(RootKey, Name, REG_BINARY, Buf, BufSize) then begin SetLength(Value, BufSize); CopyMemory(@Value[1], Buf, BufSize); FreeMem(Buf); Result := True; end; end;
function RegValueExists(RootKey: HKEY; Name: string): boolean; var SubKey: string; n: integer; hTemp: HKEY; begin Result := False; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin SubKey := Copy(Name, n + 1, Length(Name) - n); Result := (RegQueryValueEx(hTemp, PChar(SubKey), nil, nil, nil, nil) = ERROR_SUCCESS); RegCloseKey(hTemp); end; end; end;
function RegGetValueType(RootKey: HKEY; Name: string; var Value: Cardinal): boolean; var SubKey: string; n: integer; hTemp: HKEY; ValType: Cardinal; begin Result := False; Value := REG_NONE; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if (RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS) then begin SubKey := Copy(Name, n + 1, Length(Name) - n); Result := (RegQueryValueEx(hTemp, PChar(SubKey), nil, @ValType, nil, nil) = ERROR_SUCCESS); if Result then Value := ValType; RegCloseKey(hTemp); end; end; end;
function RegKeyExists(RootKey: HKEY; Name: string): boolean; var SubKey: string; n: integer; hTemp: HKEY; begin Result := False; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin Result := True; RegCloseKey(hTemp); end; end; end;
function RegDelValue(RootKey: HKEY; Name: string): boolean; var SubKey: string; n: integer; hTemp: HKEY; begin Result := False; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS then begin SubKey := Copy(Name, n + 1, Length(Name) - n); Result := (RegDeleteValue(hTemp, PChar(SubKey)) = ERROR_SUCCESS); RegCloseKey(hTemp); end; end; end;
function RegDelKey(RootKey: HKEY; Name: string): boolean; var SubKey: string; n: integer; hTemp: HKEY; begin Result := False; n := LastPos('\', Name); if n > 0 then begin SubKey := Copy(Name, 1, n - 1); if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS then begin SubKey := Copy(Name, n + 1, Length(Name) - n); Result := (RegDeleteKey(hTemp, PChar(SubKey)) = ERROR_SUCCESS); RegCloseKey(hTemp); end; end; end;
function RegEnum(RootKey: HKEY; Name: string; var ResultList: string; const DoKeys: Boolean): boolean; var i: integer; iRes: integer; s: string; hTemp: HKEY; Buf: Pointer; BufSize: Cardinal; begin Result := False; ResultList := ''; if RegOpenKeyEx(RootKey, PChar(Name), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin Result := True; BufSize := 1024; GetMem(buf, BufSize); i := 0; iRes := ERROR_SUCCESS; while iRes = ERROR_SUCCESS do begin BufSize := 1024; if DoKeys then iRes := RegEnumKeyEx(hTemp, i, buf, BufSize, nil, nil, nil, nil) else iRes := RegEnumValue(hTemp, i, buf, BufSize, nil, nil, nil, nil); if iRes = ERROR_SUCCESS then begin SetLength(s, BufSize); CopyMemory(@s[1], buf, BufSize); if ResultList = '' then ResultList := s else ResultList := Concat(ResultList, #13#10,s); inc(i); end; end; FreeMem(buf); RegCloseKey(hTemp); end; end;
function RegEnumValues(RootKey: HKEY; Name: string; var ValueList: string): boolean; begin Result := RegEnum(RootKey, Name, ValueList, False); end;
function RegEnumKeys(RootKey: HKEY; Name: string; var KeyList: string): boolean; begin Result := RegEnum(RootKey, Name, KeyList, True); end;
end. |
- Подробности
- Родительская категория: Реестр
- Категория: Общие принципы работы с реестром
Страница 26 из 42