PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Экспорт ключей из реестра


Экспорт ключей из реестра

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

1

Трям.  (pb6x64)
Хочу упростить юзеру жизнь, надо делать слепок программы, до изменения юзером, сохранять измененную версию, возвращать старую на место.

Ветки реестра. возможно ли работать без админских прав или как их или права системы прописать сразу из exe
к примеру без админских прав ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Notifications\Data
экспортировать в файл через вызов reg не возможно.
а ветку HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\bam\State\UserSettings\S-1-5-21-3063148785-2219068220-298679983-1001
не дает вытащить даже с правами админа, нужны права системы.

Причем унинстал программы их свободно удаляет, а вот как экспортировать, а не удалить из программы на PB не особо понял

PB только начал изучать, делаю через вызов reg c параметрами, выглядит, как костыль)
Если есть где ветка, как это через API сдеать на понятном языке и под х64 PB буду благодарен.
Или бибьлиотеки какие под 6х версию. droopy library нашел, но она под пятую.

0

2

Я выкладывал дополнительную справку с описанием функций и библиотеку, в ней смотри работу с реестром, под  версию 6 не проверял, думаю асм компилятор осилит. Ищи на форуме, я на работе, ссылку не могу дать.

0

3

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

Я выкладывал дополнительную справку с описанием функций и библиотеку, в ней смотри работу с реестром, под  версию 6 не проверял, думаю асм компилятор осилит. Ищи на форуме, я на работе, ссылку не могу дать.

Компилятор справки PureBasic на основе компилятора справки AutoIt3   это ??
Хотя бы примерное название темы

UPD
нашел на гитхабе Registry Module https://github.com/tajmone/purebasic-ar … y#features

Осталось найти справку)

Отредактировано pozvonok (16.09.2022 16:20:00)

0

4

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

Осталось найти справку)

В модуле не так много функций

Код:
  Declare.i ReadType(topKey,                  ; like #HKEY_LOCAL_MACHINE, #HKEY_CURRENT_USER, #HKEY_CLASSES_ROOT ...
                     KeyName.s,               ; KeyName without topKey
                     ValueName.s = "",        ; ValueName, "" for Default
                     WOW64 = #False,          ; If #TRUE, uses the 'Wow6432Node' path for Key
                     *Ret.RegValue = 0)         
  ; result 0 = error or #REG_NONE (not supported)
 
  Declare.s ReadValue(topKey,
                      KeyName.s,
                      ValueName.s = "",
                      WOW64 = #False,
                      *Ret.RegValue = 0)
  ; result "" = error
 
  Declare.i WriteValue(topKey,
                       KeyName.s,
                       ValueName.s,
                       Value.s,              ; Value as string
                       Type.l,               ; Type like: #REG_DWORD, #REG_EXPAND_SZ, #REG_SZ
                       WOW64 = #False,
                       *Ret.RegValue = 0)    ; to return more infos, is required for #REG_BINARY!
  ; result 0 = error, > 0 = successfull (1 = key created, 2 = key opened)
 
  Declare.i DeleteTree(topKey, KeyName.s, WOW64 = #False, *Ret.RegValue = 0)
  ; Deletes the subkeys and values of the specified key recursively.
  ; result 0 = error
 
  Declare.i DeleteKey(topKey, KeyName.s, WOW64 = #False, *Ret.RegValue = 0)
  ; result 0 = error
 
  Declare.i DeleteValue(topKey, KeyName.s, ValueName.s, WOW64 = #False, *Ret.RegValue = 0)
  ; result 0 = error
 
  Declare.i CountSubKeys(topKey, KeyName.s, WOW64 = #False, *Ret.RegValue = 0)
 
  Declare.i CountSubValues(topKey, KeyName.s, WOW64 = #False, *Ret.RegValue = 0)
 
  Declare.s ListSubKey(topKey, KeyName.s, index, WOW64 = #False, *Ret.RegValue = 0) ; the index is 0-based!
 
  Declare.s ListSubValue(topKey, KeyName.s, index, WOW64 = #False, *Ret.RegValue = 0)

По их имени и аргументам примерно понятно для чего нужны.

0

5

В этой проге у меня есть экспорт.

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

Компилятор справки PureBasic на основе компилятора справки AutoIt3

Да, но там нет экспорта. И учти что мой вариант исправлен в отличии от оригинала.

Run As TrustedInstaller - запуск программы с повышенными привилегиями

0

6

Спасибо, завтра посмотрю👍

0

7

func.pbi ->
Copy(*FileName.String, *regpath.String, *FileBak.String)
RegExport(*Value)
RegExportGr(*Value)

Код:
RunProgram("reg.exe", "export " + *regpath\s + " /y", "", #PB_Program_Wait | #PB_Program_Hide)

нет экспорта через API, есть на AutoIt3, но мне лень переделывать на PureBasic, там очень много работы.

Отредактировано AZJIO (16.09.2022 19:06:22)

0

8

Модули не работают, PB6 ругается на не найденные константы в них #
А я понятия не имею чему они должны быть равны.
AZJIO, ваш исходник тоже не компилируется из-за #констант

Нашел простой и понятный мне код:
спец обертка для Win Regestry функций
НО тоже константы =(

Отредактировано pozvonok (17.09.2022 11:43:07)

0

9

pozvonok
Сомневаюсь что авторы урежут функционал удалив константы, тем более реестра. Что за константы, а то может одна константа. Компилятор же останавливает на строке с ошибкой.

0

10

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

PB6 ругается на не найденные константы в них #

Демо версия? Тогда на все что связанно с WinAPI будет ругаться.

0

11

Пётр написал(а):

Демо версия? Тогда на все что связанно с WinAPI будет ругаться.

Вот гады, а обещали только на 800 строк порезать код))
Спасибо большое, многое стало понятнее

0

12

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

а обещали только на 800 строк порезать код

При каждом запуске IDE появляется окно где перечислены ограничения

Demo limitations:
- No Win32 API support
- No DLL creation
- Code size limitation (about 800 lines)

Thanks a lot for taking a look to PureBasic!

The Fantaisie Software Team.

В демо версию можно добавить поддержку WinAPI, но для этого придется объявить все используемые WinAPI функции, структуры и константы. Это дополнительные строки число которых ограничено.

0

13

А есть ли  возможность добавить константы WInApi в демку, как я понял по форумам отсутсвуют именно они
Не очень хочу крякнутый юзать для компиляции, а вдруг там что прицепит левое

Или по мимо ограничения по созданию Dll, 800 строк и констант  я еще с каким дерьмом столкнусь?

0

14

Пётр написал(а):

При каждом запуске IDE появляется окно где перечислены ограничения

В демо версию можно добавить поддержку WinAPI, но для этого придется объявить все используемые WinAPI функции, структуры и константы. Это дополнительные строки число которых ограничено.

Да в том то и дело, что не было про API . Гады  https://forumupload.ru/uploads/0009/ae/28/672/t979348.png

0

15

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

А есть ли  возможность добавить константы WInApi в демку, как я понял по форумам отсутсвуют именно они

Извлеките архив в папку с установленным PureBasic 6.00 https://dropmefiles.com/rpfFG
Константы должны появится (не проверял), а с WinAPI функциями сложнее. Их необходимо вручную добавить https://www.purebasic.com/documentation … mport.html

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

Не очень хочу крякнутый юзать для компиляции

Если дистрибутив с цифровой подписью от Frederic Laboureur и не требуется заменять файлы после установки, это лицензионный PB.

0

16

Пётр написал(а):

Если дистрибутив с цифровой подписью от Frederic Laboureur и не требуется заменять файлы после установки, это лицензионный PB.

MONSIEUR FREDERIC LABOUREUR

Спасибо вам большое. Заработало.
А я неделю недоумевал какого хрена выкладывают нерабочие модули :tired:
Осталось теперь разобраться в тех якобы не рабочих примерах из-за #констант, что я находил)))

0

17

поставил себе 5.72 LTS pb вместо 6 демо.
Все замечательно было, пока не дошел до этого

Код:
Directory.s = GetCurrentDirectory()  ; в данный момент это C:\ProgramData\PureBasic\

  If ExamineDirectory(0, Directory.s, "*.*")   
    While NextDirectoryEntry(0)  ; ОШИБКА - #directory не инициализирован
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Name.s = DirectoryEntryName(0)
        ex.s = LCase(GetExtensionPart(Name))
        
        If ex="exe"                          ;если файл ехе то проверка имени
          If  FindString(Name, "Install")     ; Маска имени
            
            Download =2
            FinishDirectory(0)
            
          EndIf    
        EndIf
        
        
      EndIf
    Wend
    FinishDirectory(0)
  EndIf

Если прописать путь на прямую "C:\" то все работает, а работать с текущей директорией не хочет, пишет #directory не инициализирован
На демо этот код работал. Удалил все, поставил опять демо6, не работает и там. Что могло случится. Кроме перестановок версий больше ничего в системе не делал.
Проверил Curendir = programdata\purebasic  только для чтения, атрибут не снимается.

UPD:
Попробовал сохранить в корневую C:\  исходник , а мне выдало у вас нет разрешений на сохранение сюда.  - Это что за новости такие?
Сохранил в USER\Name\temp -заработало.
Что такого инсталл 2.72 сотворил с правами и как это исправить, но ничего не угробить?

0

18

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

ProgramData, это вроде не для всех, может для неё права какие хитрые нужны

0

19

pozvonok
1. на диск C:\ запрещено виндой, нужны админ права, даже для создания файла или папки в самом проводнике. Странно что для вас это только сейчас открытие и связываете с PureBasic.
2. Может вместо GetCurrentDirectory() что-то вроде Directory = GetPathPart(ProgramFilename()). Для примера откройте любой мой исходник, не идеал, но многие вопросы могут сразу отпасть, без пересказа всего в одной теме.
3. 

Удалил все, поставил опять демо6

. А зачем удалять? Сделать папку C:\PureBasic\PureBasic6 и в папке PureBasic любые версии. Но только надо красиво делать ком-строку, в ней можно указать общую папку конфигов в C:\PureBasic\config и в реестре для запуска pb-файлов прописать ком-строку для взятия конфигов, аналогично и в ярлыке на рабочем столе, тогда вообще будет все в себе. В реестре добавить несколько пунктов для всех версий 32/64 и 572/600, последняя запущенная будет прописывать свою команду запускаемой "Открыть" - Open в реестре. Запускай исходник в любой версии.
4. Почитай  справку CHM для новичка
http://forum.ru-board.com/topic.cgi?for … start=20#6

5. Скачать конфиг для PureBasic, смотреть/подменить в %AppData%/Roaming/PureBasic

6. Для создания меню могут пригодится SubMenuWin7_10 и ContMenuFiles

Отредактировано AZJIO (18.09.2022 11:03:44)

0

20

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

pozvonok
1. на диск C:\ запрещено виндой, нужны админ права, даже для создания файла или папки в самом проводнике. Странно что для вас это только сейчас открытие и связываете с PureBasic.
2. Может вместо GetCurrentDirectory() что-то вроде Directory = GetPathPart(ProgramFilename()). Для примера откройте любой мой исходник, не идеал, но многие вопросы могут сразу отпасть, без пересказа всего в одной теме.

1. за 30  лет первый раз столкнулся=)

у меня вообще другая организация папок Все на C:\Folder\folder, как  у вас  в конфигах c:\purebasic

newJS русские буквы в путях не использую никогда

UPD Все заработало. Спасибо большое, AZJIO.

Но почему PB ругается на GetCurrentDirectory() если исходник не в папке юзера, я так и не понял

Причем PB компилирует исходник в EXE c GetCurrentDirectory(), на которую ругался (если запускать код прямо из исходника) и она прекрасно работает

Отредактировано pozvonok (18.09.2022 11:57:51)

0

21

pozvonok
не совсем понял вопроса. GetCurrentDirectory() - текущая папка, если честно я пока не понимаю её поведение, текущая папка возможно "Мои документы", с чего оно должно видеть исходник? Выведи в отладчик то что возвращает GetCurrentDirectory(), а лучше в мессагу, чтобы тестить скомпилированный исходник. Вариант предложенный берёт путь исполняемого файла, естественно это не какой-то случайный путь, а конкретный, который не меняется и всегда точно определён. А GetCurrentDirectory() может изменится при выборе другого каталога нутри программы с помощью диалогового окна выбора папки, так что он величина случайная, единственное на запуске он имеет какое-то умолчальное значение, но не долго.
pozvonok

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

у меня вообще другая организация папок Все на C:\Folder\folder,

да у меня также, все в C:\D\ это у меня считается диск D. Я же не буду свои пути тут выдавать, а так у меня C:\D\PureBasic\PureBasic572.
При компиляции в настроках можно указать компилировать в папке где исходник, это удобно, когда есть внешние файлы ini-файл и другие, тогда их не придётся копировать в %TEMP%.

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

Но почему PB ругается на GetCurrentDirectory() если исходник не в папке юзера

А с чего ему ругаться? Он возвращает текущую папку вне зависимости от того где исходник.

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

Причем PB компилирует исходник в EXE c GetCurrentDirectory(), на которую ругался (если запускать код прямо из исходника) и она прекрасно работает

Временный файл компиляции с отладкой и готовый исполняемый файл это не одна и та же папка.

0

22

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

pozvonok

А с чего ему ругаться? Он возвращает текущую папку вне зависимости от того где исходник.

На строку после GetDir ругается While NextDirectoryEntry(0)  ; ОШИБКА - #directory не инициализирован 
Если GetPathPart(ProgramFilename()) , то все нормально.
временный файл запускается из appdata\local\temp\  ,
Поставил галочку создавать временный файл в сорс директории и снова ошибка While NextDirectoryEntry(0)  ; ОШИБКА - #directory не инициализирован,

Код:
Directory.s =GetPathPart(ProgramFilename())

If ExamineDirectory(0, Directory.s, "*.*")
While NextDirectoryEntry(0)   

Отредактировано pozvonok (18.09.2022 12:55:04)

0

23

так что только юзер директории работают у меня =(
Как бы ему пояснить, что работать надо во всех директориях?

UPD
Если отключить дебагер то все работает нормально. Ругался дебагер

Отредактировано pozvonok (18.09.2022 13:01:34)

0

24

#directory это константа, она не может быть определена после, она определяется во время компиляции. Если отладчик даёт ошибку то в 99% это ошибка, исключение только для профессионалов, которые знают что делают, а классический код отладчик нормально отделяет мух от котлет.

выполни
Debug GetCurrentDirectory()

Отредактировано AZJIO (18.09.2022 13:56:27)

0

25

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

Попробовал сохранить в корневую C:\  исходник , а мне выдало у вас нет разрешений на сохранение сюда.

Начиная с Windows Vista без прав администратора не допускается запись в корень диска C: в папки Windows, Program Files и другие.

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

не совсем понял вопроса. GetCurrentDirectory() - текущая папка, если честно я пока не понимаю её поведение

Это папка относительно которой производится поиск файлов если не задан абсолютный путь к ним.
https://learn.microsoft.com/en-us/windo … tdirectory

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

временный файл запускается из appdata\local\temp\  , где именно это поменять ?

Компилятор -> Настройки компилятора -> Компиляция/Запуск -> Создавать временные исполняемые файлы в исходном каталоге.

0

26

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

#directory это константа, она не может быть определена после, она определяется во время компиляции. Если отладчик даёт ошибку то в 99% это ошибка, исключение только для профессионалов, которые знают что делают, а классический код отладчик нормально отделяет мух от котлет.

выполни
Debug GetCurrentDirectory()

Отредактировано AZJIO (Сегодня 13:56:27)

Debug раземеется стоит везде GetCurrentDirectory() и GetPathPart(ProgramFilename())  выдают текущую директорию.
Все стер, чистил реестр, переустанавливал.
И после этого  DEbuger заткнулся. В этом коде ничего не менял.
что это было так и не понял. Исчезло ли на совсем - не знаю.

0

27

Спасибо, вы мне очень помогли разобраться во внутренностях PB

0

28

pozvonok
попробуй выполнить свой EXE из cmd-файла в другой папке или ярлыка с указанием рабочего каталога и GetCurrentDirectory() уже не будет использовать текущую папку программы, так как переменная родительского процесса передаёт эту текущую директорию, именно поэтому запуск из IDE выдаёт текущий путь - папка компилятора, а запустил бы код из Notepad++, текущей директорией был бы папка Notepad++. В общем для работы этой функции надо испоьзовать SetCurrentDirectory(), тогда во время запуска, во время выполнения кода будет определена текущая папка как папка программы, а не родительского процесса.

Код:
SetCurrentDirectory(GetPathPart(ProgramFilename()))

Отредактировано AZJIO (18.09.2022 14:19:16)

0

29

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

pozvonok
попробуй выполнить свой EXE из cmd-файла в другой папке или ярлыка с указанием рабочего каталога и GetCurrentDirectory() уже не будет использовать текущую папку программы, так как переменная родительского процесса передаёт эту текущую директорию, именно поэтому запуск из IDE выдаёт текущий путь - папка компилятора, а запустил бы код из Notepad++, текущей директорией был бы папка Notepad++. В общем для работы этой функции надо испоьзовать SetCurrentDirectory(), тогда во время запуска, во время выполнения кода будет определена текущая папка как папка программы, а не родительского процесса.

Отредактировано AZJIO (Сегодня 14:19:16)

EXE без дебагер работает без проблем, ругается только дебагер, если его включить в компиляторе.
Сейчас не ругается, когда файла искомого нет, но стоит файл скопировать в папку (мне надо определить, когда пользователь закачает install)   , так сразу на строку While NextDirectoryEntry(0)  ; ОШИБКА - #directory не инициализирован. ДО того как искомый файл появился в папке, дебагер исправно работает, выдает все имена файлов в папке по  debug Name.s
Без дебагера exe работает нормально.
А дебагеру гнет свою линию. На SetCurrentDirectory(GetPathPart(ProgramFilename())) ему плевать.
Я не понимаю чего он хочет

0

30

Все разобрался. на что ругается. Похоже Mea culpa
После нахождения файла он выполняет условия цикла и попадает опять на Wend, которая его отсылает к While, вместо завершения оного. Соответсвенно и ругается дебагер.
Я почему-то думал что логика другая, если условие выполнено, то Wile больше циклить не будет.
Простите, что морочил голову

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Экспорт ключей из реестра