AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
ChkDskGui (PureBasic)
Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия
Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)
|
Отправлено: 10-Янв-2019 21:23
(спустя 8 месяцев 1 день)
Gemostarter
- Стаж: 7 лет 8 месяцев
- Сообщений: 323
- Репутация:35[+] [-]
|
60871 Значит дело в доступе?!?!?! Заработало от админа! Ну конечно, это же куст System, как иначе?60871буду теперь пробовать через сохранение, тут точно проблем не будет. Если только импортировать через regedit, и подтверждать повышение прав каждый раз руками, а это не айс. Почему бы просто не запхать в прогу манифест, и прописать там, чтобы всегда стартовала от админа?60871RegSetValueEx_(hKey, @param$, 0, #REG_EXPAND_SZ, @res$, Len(res$)) Len(res$) лучше заменить на StringByteLength(res$), иначе нормально работать будет только при компиляции в ascii.
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
60876Len(res$) лучше заменить на StringByteLength(res$), иначе нормально работать будет только при компиляции в ascii. не замечал такого...
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
пробуйте, у меня пока работает ргхост на пастбине тоже обновил исходник, но он есть и в архиве 6087860876Len(res$) лучше заменить на StringByteLength(res$), иначе нормально работать будет только при компиляции в ascii. да, заменил Len(valie)*2 на StringByteLength(valie), заработало без непоняток
|
Gemostarter
- Стаж: 7 лет 8 месяцев
- Сообщений: 323
- Репутация:35[+] [-]
|
60878не замечал такого... Вероятно, просто не сталкивался с функциями, которые требуют длину в байтах, а не в символах, и при этом не хотят подсчитывать длину строки сами. RegSetValueEx_() именно такая, ибо может принимать не только строки, но и вообще всё, что угодно, поэтому требует размер буфера памяти в байтах.
|
Gemostarter
- Стаж: 7 лет 8 месяцев
- Сообщений: 323
- Репутация:35[+] [-]
|
Вопрос не в тему: кто-нибудь знает, как сделать Drag&Drop файлов при включённом UAC (у источника права ниже, чем у получателя) для одного-единственного гаджета? Для всего окна сделать просто, но это совсем не то. Пока удалось добиться только того, что файлы перетаскиваются, но как прочитать данные, понятия не имею.
|
nikzzzz
- Стаж: 9 лет 10 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO,60880да, заменил Len(valie)*2 на StringByteLength(valie), заработало без непоняток Там наверное нужно было указывать Len(valie)*2+2 , учитывая два нулевых байта в конце.
|
nikzzzz
- Стаж: 9 лет 10 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
Gemostarter60888 как сделать Drag&Drop файлов при включённом UAC Вопрос уже обсуждался на этом форуме, точно где, не помню, вот решение.;DragAcceptAction #DA_Add = 1 ; Добавляет DragFile или DragDir вместо замены #DA_Dir = 2 ; #DA_File = 4 ; Default #DA_MaxGadgetNumber = 20 ; GadgetNumber не должен превышать это значение !!! #PB_FileSystem_Dir = 16 Global lpOldWndProc Global Dim DragAcceptAction(#DA_MaxGadgetNumber + 1) Macro DragAcceptFiles(GadgetNumber,Action=4) DragAcceptFiles_(GadgetID(GadgetNumber), 1) lpOldWndProc = SetWindowLongPtr_(GadgetID(GadgetNumber), #GWL_WNDPROC, @WndProc()) DragAcceptAction(GadgetNumber) = Action EndMacro Macro IgnoreUAC() If OSVersion() >= #PB_OS_Windows_Vista user32_dll = OpenLibrary(#PB_Any, "user32.dll") CallFunction(user32_dll, "ChangeWindowMessageFilter", #WM_DROPFILES, #MSGFLT_ADD) CallFunction(user32_dll, "ChangeWindowMessageFilter", #WM_COPYDATA, #MSGFLT_ADD) CallFunction(user32_dll, "ChangeWindowMessageFilter", $0049, #MSGFLT_ADD) CloseLibrary(user32_dll) EndIf EndMacro Macro DragAcceptFree(GadgetNumber) SetWindowLongPtr_(GadgetID(GadgetNumber), #GWL_WNDPROC, lpOldWndProc) EndMacro Procedure GadgetFromGadgetID(GadgetID) If IsWindow_(GadgetID) ProcedureReturn GetDlgCtrlID_(GadgetID) EndIf ProcedureReturn -1 EndProcedure Procedure WndProc(hwnd, uMsg, wParam, lParam) Protected NumberOfCharactersDropped.i,CharacterIndex.i , Action.i, FileAttribDir.i Protected CharacterBuffer.s = Space(#MAX_PATH),GadgetNumber.l, DropText.s = "" Select uMsg Case #WM_DROPFILES GadgetNumber=GadgetFromGadgetID(hwnd) If GadgetNumber <>-1 Action=DragAcceptAction(GadgetNumber) If Action & $1 : DropText = GetGadgetText(GadgetNumber) : EndIf NumberOfCharactersDropped = DragQueryFile_(wParam , $FFFFFFFF, #NUL, 0) For CharacterIndex = 0 To NumberOfCharactersDropped - 1 DragQueryFile_(wParam, CharacterIndex, CharacterBuffer, #MAX_PATH) If GetFileAttributes(CharacterBuffer) & #PB_FileSystem_Dir : FileAttribDir=0 : Else : FileAttribDir=-1 : EndIf If (FileAttribDir And (Action & $4)) Or (Not FileAttribDir And (Action & $2)) If DropText<>"" : DropText + Chr(10) : EndIf DropText = DropText + CharacterBuffer EndIf Next If Not DropText = "" SetGadgetText(GadgetNumber, DropText) EndIf EndIf DragFinish_(*DroppedFilesArea) EndSelect ProcedureReturn CallWindowProc_(lpOldWndProc, hWnd, uMsg, wParam, lParam) EndProcedure ;;;;;;;;;;;;;;; Main Demo ;;;;;;;;;;;;; IgnoreUAC() hWnd0 = OpenWindow(0, 0, 0, 400, 400, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) EditorGadget(4, 10, 10, 380, 180, #PB_Editor_ReadOnly) ;Добавить в список захваченные файлы DragAcceptFiles(4, #DA_File | #DA_Add) EditorGadget(5, 10, 200, 380, 180, #PB_Editor_ReadOnly) ;Список - только захваченные каталоги DragAcceptFiles(5, #DA_Dir) While #True Select WaitWindowEvent () Case #PB_Event_CloseWindow Break EndSelect Wend DragAcceptFree(4) DragAcceptFree(5)
|
Gemostarter
- Стаж: 7 лет 8 месяцев
- Сообщений: 323
- Репутация:35[+] [-]
|
60889Там наверное нужно было указывать Len(valie)*2+2 , учитывая два нулевых байта в конце. nikzzzz, тогда уж Len(valie) * SizeOf(Character) + SizeOf(Character). У - Универсальность! StringByteLength(), кстати, не учитывает конечный NULL, он аналогичен Len(valie) * SizeOf(Character), если строка не UTF-8. А если UTF-8, то StringByteLength() - единственный адекватный вариант.О, вероятно, то, что нужно...
|
nikzzzz
- Стаж: 9 лет 10 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
Там наверное нужно было указывать Len(valie)*2+2 , учитывая два нулевых байта в конце. Пётр с сайта PureBasic предложил StringByteLength("1234", #PB_Unicode), хотя по умолчанию последний параметр зависит от исходника, что сказано в описании функции и можно опустить. Длина символа в байтах зависит от кодировки исходника. А в теории зачем там лишних 2? Это же не нуль-терминированная строка. Функция запрашивает длину чтобы взять текст указанной длины, то есть критерий не null
|
nikzzzz
- Стаж: 9 лет 10 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO Вот пример
На картинке видно, что длина строки 8 символов, а в реестре он занимает 18 (8*2 + 2) байт, то-есть в конце добавлены 2 нулевых байта.
|
Gemostarter
- Стаж: 7 лет 8 месяцев
- Сообщений: 323
- Репутация:35[+] [-]
|
AZJIO, если указать длину без NULL, то и в реестр запишется без. То есть, при чтении строка будет длиннее, чем должна быть, в конец накидается мусор. Если в своей программе вы этого избежите, подумайте о других - они не ждут такой подлянки.
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
Gemostarter, как понять в своей программе вы этого избежите? Разве программа по разному действует взависимости от пользователя? Подлянки я вообще не делаю, это для невежд, у меня только необходимость аргументированного ответа влияет на принятие или нет. Ну и конечно я проверил работу просмотром в реестре и перезагрузкой с проверкой. nikzzzz, так может реестр сам добавляет в конец эти 2 нулевых байта. Мы же указываем строку которую нужно взять из памяти для того чтобы её вставить в реестр. Если указать лишние 2 байта, как раз в этом случае он захватит мусор из памяти и вставит их в реестр, не? Или строка изначально нуль-терминированная в памяти и нужно взять с этим нуль? Или реестр хранит либо форматы числовые которые определяются длинной либо строковые и бинарные которые определяются нулями в конце? Хотя для бинарных данных какой нуль, там он сам может иметь нули в средине, значит должен сохранять длину данных? и у нас формат сжатой строки, а не просто строки, значит там нули могут быть где угодно и он вроде как не должен определять конец строки.
Последний раз редактировалось: AZJIO (2019-01-12 09:31), всего редактировалось 1 раз
|
Gemostarter
- Стаж: 7 лет 8 месяцев
- Сообщений: 323
- Репутация:35[+] [-]
|
AZJIO, Я проверял запись всех видов строк в реестр. Автоматически NULL не добавляется никогда. Вообще никакой автоматики. Не проверяется тип передаваемых данных, и наличие NULL в конце строки тоже, но этот символ должен быть в переданном буфере.For string-based types, such as REG_SZ, the string must be null-terminated. With the REG_MULTI_SZ data type, the string must be terminated with two null characters. "у нас формат сжатой строки" - это как?
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
Сделал примеры и проверил как вносятся данные: AutoIt3... После запуска скрипта просматриваем реестр и в конт. меню параметра "Изменить двоичные данные" видим, что нуль-нуль сам добавился. Далее думаю, не является ли это обработчик автоита, который красиво за нас доделывает и проверяю в PureBasic$x = Chr(0) ; RegWrite('HKEY_CURRENT_USER\Control Panel', 'param2', 'REG_EXPAND_SZ', 'video' & $x & $x & $x & 'file') RegWrite('HKEY_CURRENT_USER\Control Panel', 'param2', 'REG_EXPAND_SZ', 'video') PureBasic...., всё также проверяю, также добавлен нуль нуль.Handle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Control Panel", 0, #KEY_WRITE, @hKey) If Handle = #ERROR_SUCCESS valie.s = "video" param$="param2" RegSetValueEx_(hKey, @param$, 0, #REG_EXPAND_SZ, @valie, StringByteLength(valie, #PB_Unicode)) RegCloseKey_(hKey) EndIf Gemostarterтфу забыл, переменные которые автоматически раскрываются.
|
Страница 9 из 34
Текущее время: 28-Ноя 18:44
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|