[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 9 месяцев
  • Сообщений: 1322
  • Репутация:127

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 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
  • 1039
  • Стаж: 9 лет 5 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
60876Len(res$) лучше заменить на StringByteLength(res$), иначе нормально работать будет только при компиляции в ascii.
не замечал такого...

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 9 месяцев
  • Сообщений: 1322
  • Репутация:127

    [+] [-]
пробуйте, у меня пока работает
ргхост
на пастбине тоже обновил исходник, но он есть и в архиве
60878
60876Len(res$) лучше заменить на StringByteLength(res$), иначе нормально работать будет только при компиляции в ascii.
да, заменил Len(valie)*2 на StringByteLength(valie), заработало без непоняток

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
60878не замечал такого...
Вероятно, просто не сталкивался с функциями, которые требуют длину в байтах, а не в символах, и при этом не хотят подсчитывать длину строки сами. RegSetValueEx_() именно такая, ибо может принимать не только строки, но и вообще всё, что угодно, поэтому требует размер буфера памяти в байтах.

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
Вопрос не в тему: кто-нибудь знает, как сделать Drag&Drop файлов при включённом UAC (у источника права ниже, чем у получателя) для одного-единственного гаджета? Для всего окна сделать просто, но это совсем не то.
Пока удалось добиться только того, что файлы перетаскиваются, но как прочитать данные, понятия не имею.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 10 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
60880да, заменил Len(valie)*2 на StringByteLength(valie), заработало без непоняток
Там наверное нужно было указывать Len(valie)*2+2 , учитывая два нулевых байта в конце.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 10 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Gemostarter
60888 как сделать 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
  • 15956
  • Стаж: 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() - единственный адекватный вариант.
60890вот решение
О, вероятно, то, что нужно...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 10 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Gemostarter
Нашел тему

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 9 месяцев
  • Сообщений: 1322
  • Репутация:127

    [+] [-]
Там наверное нужно было указывать Len(valie)*2+2 , учитывая два нулевых байта в конце.
Пётр с сайта PureBasic предложил StringByteLength("1234", #PB_Unicode), хотя по умолчанию последний параметр зависит от исходника, что сказано в описании функции и можно опустить. Длина символа в байтах зависит от кодировки исходника. А в теории зачем там лишних 2? Это же не нуль-терминированная строка. Функция запрашивает длину чтобы взять текст указанной длины, то есть критерий не null

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 10 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO
Вот пример

На картинке видно, что длина строки 8 символов, а в реестре он занимает 18 (8*2 + 2) байт, то-есть в конце добавлены 2 нулевых байта.

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
AZJIO, если указать длину без NULL, то и в реестр запишется без. То есть, при чтении строка будет длиннее, чем должна быть, в конец накидается мусор. Если в своей программе вы этого избежите, подумайте о других - они не ждут такой подлянки.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 9 месяцев
  • Сообщений: 1322
  • Репутация:127

    [+] [-]
Gemostarter, как понять в своей программе вы этого избежите? Разве программа по разному действует взависимости от пользователя? Подлянки я вообще не делаю, это для невежд, у меня только необходимость аргументированного ответа влияет на принятие или нет. Ну и конечно я проверил работу просмотром в реестре и перезагрузкой с проверкой.
nikzzzz, так может реестр сам добавляет в конец эти 2 нулевых байта. Мы же указываем строку которую нужно взять из памяти для того чтобы её вставить в реестр. Если указать лишние 2 байта, как раз в этом случае он захватит мусор из памяти и вставит их в реестр, не? Или строка изначально нуль-терминированная в памяти и нужно взять с этим нуль? Или реестр хранит либо форматы числовые которые определяются длинной либо строковые и бинарные которые определяются нулями в конце? Хотя для бинарных данных какой нуль, там он сам может иметь нули в средине, значит должен сохранять длину данных? и у нас формат сжатой строки, а не просто строки, значит там нули могут быть где угодно и он вроде как не должен определять конец строки.


Последний раз редактировалось: AZJIO (2019-01-12 09:31), всего редактировалось 1 раз

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 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
  • 17953
  • Стаж: 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:45

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы