PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Как заменить значение в реестре?


Как заменить значение в реестре?

Сообщений 1 страница 14 из 14

1

Я совсем плох в API виндов, может, кто подскажет, как это сделать?

Код:

Procedure.i EnumRegValues(RootHKEY.l, sKey.s, StringToFind.s, StringToSet.s) ; считывает все параметры заданного ключа реестра 
  Protected hKey.l
  If RegOpenKeyEx_(RootHKEY, sKey, 0, #KEY_READ, @hKey) = #ERROR_SUCCESS    ; 
   idx.l = 0
   Repeat
     ValueName.s = Space(511):  ValueNameLen.l = Len(ValueName)
     ValueData.s = Space(511):  ValueDataLen.l = Len(ValueData)
     Retval.l = RegEnumValue_(hKey, idx, @ValueName, @ValueNameLen, #Null, @dwType, @ValueData, @ValueDataLen) ; считал новую строчку в реестре
     If Retval <> #ERROR_SUCCESS
       Break
     EndIf
     ValueName = Left(ValueName, ValueNameLen)
     Select dwType
       Case #REG_SZ
         ValueData = Left(ValueData, ValueDataLen - 1) ; строки в выбранной ветке реектра
         Debug ValueData
          If FindString(ValueData, StringToFind.s)
            ;Debug "idx="+idx ; найдено
            If RegSetValueEx_(hKey, StringToSet, 0, #REG_SZ, @StringToFind, Len(StringToFind) + 1) ;<<<<<<<пытаюсь заменить и ничего не получается ((
              Else
                Debug "Не получилось!" 
            EndIf   
          EndIf
        EndSelect  
        idx+ 1          
   Until Retval <> #ERROR_SUCCESS
   RegCloseKey_(hKey)
 Else
   Debug "Сбой чтения реестра":End  
 EndIf
EndProcedure

aa$="{C0851D0F-747D-4070-9C7A-31510EAF23D0}_is1"
StringToFind.s="версия 1.05" ; что надо найти
StringToSet.s="версия 1.06" ; на что поменять
EnumRegValues(#HKEY_CURRENT_USER, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"+aa$, StringToFind.s, StringToSet.s) 

0

2

Код:
            If RegSetValueEx_(hKey, StringToSet, 0, #REG_SZ, @StringToFind, Len(StringToFind) + 1) ;<<<<<<<пытаюсь заменить и ничего не получается ((

@StringToFind  — указатель на строку? Строка уже указатель, зачем вам указатель на указатель. Наверняка здесь опечатка, потому что рядом StringToSet без собаки.
Удалите собаку, и наверняка заработает.

0

3

Замабувараев написал(а):

@StringToFind  — указатель на строку? Строка уже указатель, зачем вам указатель на указатель. Наверняка здесь опечатка, потому что рядом StringToSet без собаки.
Удалите собаку, и наверняка заработает.

Это я нарыл из инета. Там - с собакой. Я попробовал сейчас и так, ничего не происходит.

0

4

Код:
If RegSetValueEx_(hKey, StringToSet, 0, #REG_SZ, @StringToFind, StringByteLength(StringToFind) + SizeOf(Character))

Посмотрите этот код https://www.purebasic.fr/english/viewtopic.php?t=56204

0

5

описание и примеры

Код:
EnableExplicit

XIncludeFile "Registry.pbi"

Define count, i, Key$
Define param$, iRes, Valie$
Define aa$, StringToFind.s, StringToSet.s

aa$="{C0851D0F-747D-4070-9C7A-31510EAF23D0}_is1"
StringToFind="версия 1.05" ; что надо найти
StringToSet="версия 1.06" ; на что поменять


UseModule Registry
Key$ = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + aa$
Debug Key$

count = CountSubValues(#HKEY_CURRENT_USER, Key$)
Debug count
For i = 0 To count - 1
	param$ = ListSubValue(#HKEY_CURRENT_USER, Key$, i)
	If Asc(param$)
    Valie$ = ReadValue(#HKEY_CURRENT_USER, Key$, param$)
    If Asc(Valie$) And Valie$ = StringToFind
    	iRes = WriteValue(#HKEY_CURRENT_USER, Key$, param$, StringToSet, #REG_SZ)
    	Break
    EndIf
	EndIf
Next

If iRes
	Debug "перезаписано"
Else
	Debug "не перезаписано по какой либо причине (не найдено, нет прав и т.д.)"
EndIf

Отредактировано AZJIO (13.08.2023 19:03:36)

0

6

Большое спасибо за ответы.

Код:
RegSetValueEx_(hKey, StringToSet, 0, #REG_SZ, @StringToFind, StringByteLength(StringToFind) + SizeOf(Character))

не сработало. Ну и ладно, AZJIO дал готовый рабочий вариант ( только пришлось Asc(Valie$) And Valie$ = StringToFind заменить на рабочее FindString(Valie$, StringToFind))
И если это еще сработает под не админом на W10&W11, то я буду самым счастливым человеком на свете (ну, почти))
P.S. AZJIO, ваш домен http://azjio.narod.ru жесточайше блочится. Не просто блочится, а именно жестко. Мне пришлось VPN-ить, чтобы на него попасть. Может, это только из-за отсутствия SSL сертификата, но мой пров уверял меня, что на ваш сайт ходить ну никак нельзя). Посмотрите его на вирусы, непонятна причина такой нелюбви, возможно, он в каких-то списках находится. Просто там у вас масса интересной инфы (хотя ее и оформлять надо), но о Вашем сайте поисковики никогда не расскажут.

Отредактировано Goga (14.08.2023 08:18:36)

0

7

Goga
Там https, у многих ничего не блочится, гугл выдает в поиске, даже Фред писал что ему понравилось как оформлена справка. Блокировки рекламы отлично справляется, эта плата за бесплатность. Юкоз перекупил народру, но оставил способ доступа по фтп, так что с сайтом удобно работать.
Кстати справка эта выкладывается мной на этом форуме в виде CHM,  и кстати в системе из трёх файлов отлично встраивается в основную справку.

Отредактировано AZJIO (14.08.2023 13:38:16)

0

8

AZJIO написал(а):

Goga
Там https, у многих ничего не блочится, гугл выдает в поиске, даже Фред писал что ему понравилось как оформлена справка. Блокировки рекламы отлично справляется, эта плата за бесплатность. Юкоз перекупил народру, но оставил способ доступа по фтп, так что с сайтом удобно работать.
Кстати справка эта выкладывается мной на этом форуме в виде CHM,  и кстати в системе из трёх файлов отлично встраивается в основную справку.

Отредактировано AZJIO (Вчера 20:38:16)

эта ваша ссылка http://azjio.narod.ru/PureBasic/pb_user … gement.htm Видите http, a не httpS. Я бы и скрин блокировки доступа приложил, если бы мы ваш домен обсуждали. Но, я вам дал инфу, как с ней поступить, ваше право.

0

9

Замабувараев написал(а):

@StringToFind  — указатель на строку? Строка уже указатель, зачем вам указатель на указатель. Наверняка здесь опечатка, потому что рядом StringToSet без собаки.
Удалите собаку, и наверняка заработает.

Без разницы, с собакой или без. Пурик сам подставляет собаку, если её нет, когда в функциях WinApi требуется указатель.

0

10

Замабувараев написал(а):

Строка уже указатель, зачем вам указатель на указатель.

Скорее объект или структура, которую понимает сам PureBasic. А @StringToFind это стандартный способ получить указатель, то есть число к которому можно что-то прибавить и получить новую позицию в строке. А компилятор действительно умеет как бы условно подставить @, зная что функция требует указатель на строку. Но я явно использую @ чтобы легче читать код, хотя я уже понимаю, что WinAPI при обращении к строке всегда использует указатель, а вторым параметром длину строки, чтобы не превысить. Для WinAPI понятие строки это просто некий участок памяти с указанием его длины.

0

11

Но я явно использую @ чтобы легче читать код

Есть функции которые принимают указатель на указатель, например, GetFullPathNameW.
Как поступить в этом случае?

0

12

Замабувараев написал(а):

Как поступить в этом случае?

Код:
Buff.s{1024}
FilePart.String
GetFullPathName_(GetFilePart(ProgramFilename()), 1024, @Buff, @FilePart)
Debug Buff
Debug FilePart\s

0

13

Замабувараев написал(а):

Есть функции которые принимают указатель на указатель, например, GetFullPathNameW.
Как поступить в этом случае?

https://azjio.narod.ru/PureBasic/pb_use … OnPath.htm

Причина использования указателя на указатель, то что невозможно заранее определить размер буфера и если потребуется перевыделение памяти и изменение адреса указателя, соответственно функция возвращает в переданный указатель указатель на данные, а пользователь читает из указателя указатель на данные.

Отредактировано AZJIO (16.08.2023 06:57:42)

0

14

Читаю дискусс с интересом, много полезного. Меж тем сообщаю, что операция записи в реестр, во всяком случае в ветке Uninstall успешно срабатывает и не под админом. Проверено в Windows11.
Теперь еще буду надеяться, чтобы еще защитник виндов не кричал про вирусы. А то натерпелся с ним уже((

Отредактировано Goga (16.08.2023 07:17:03)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Как заменить значение в реестре?