[Quote]

    AZJIO
  • 17953
  • Longevity: 1 year 4 months
  • Posts: 186
  • REPUTATION:40

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v3.1 (x86, x64)Скачать yadi.skИсходник на pastebin'еНе сделано:
1. нет компоновки окон
2. нет настройки через ini-файл (игнор дисков)
3. нет сортировки списка дисков, что определяет и порядок проверки


Last edited by AZJIO on 2019-02-27 09:20; edited 34 times in total

[Quote]

    Gemostarter
  • 15956
  • Longevity: 2 years 3 months
  • Posts: 153
  • REPUTATION:18

    [+] [-]
60871
Значит дело в доступе?!?!?!
Заработало от админа!
Ну конечно, это же куст System, как иначе?
60871буду теперь пробовать через сохранение, тут точно проблем не будет.
Если только импортировать через regedit, и подтверждать повышение прав каждый раз руками, а это не айс.
Почему бы просто не запхать в прогу манифест, и прописать там, чтобы всегда стартовала от админа?
60871RegSetValueEx_(hKey, @param$, 0, #REG_EXPAND_SZ, @res$, Len(res$))
Len(res$) лучше заменить на StringByteLength(res$), иначе нормально работать будет только при компиляции в ascii.

[Quote]

    Joker-2013
  • 1039
  • Longevity: 4 years
  • Posts: 2448
  • REPUTATION:120

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 1 year 4 months
  • Posts: 186
  • REPUTATION:40

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 2 years 3 months
  • Posts: 153
  • REPUTATION:18

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 2 years 3 months
  • Posts: 153
  • REPUTATION:18

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 5 months
  • Posts: 2660
  • REPUTATION:127

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 5 months
  • Posts: 2660
  • REPUTATION: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)

[Quote]

    Gemostarter
  • 15956
  • Longevity: 2 years 3 months
  • Posts: 153
  • REPUTATION:18

    [+] [-]
60889Там наверное нужно было указывать Len(valie)*2+2 , учитывая два нулевых байта в конце.
nikzzzz, тогда уж Len(valie) * SizeOf(Character) + SizeOf(Character). У - Универсальность!
StringByteLength(), кстати, не учитывает конечный NULL, он аналогичен Len(valie) * SizeOf(Character), если строка не UTF-8. А если UTF-8, то StringByteLength() - единственный адекватный вариант.
60890вот решение
О, вероятно, то, что нужно...

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 5 months
  • Posts: 2660
  • REPUTATION:127

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 1 year 4 months
  • Posts: 186
  • REPUTATION:40

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 5 months
  • Posts: 2660
  • REPUTATION:127

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

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

[Quote]

    Gemostarter
  • 15956
  • Longevity: 2 years 3 months
  • Posts: 153
  • REPUTATION:18

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 1 year 4 months
  • Posts: 186
  • REPUTATION:40

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


Last edited by AZJIO on 2019-01-12 09:31; edited 1 time in total

[Quote]

    Gemostarter
  • 15956
  • Longevity: 2 years 3 months
  • Posts: 153
  • REPUTATION:18

    [+] [-]
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.
"у нас формат сжатой строки" - это как?

[Quote]

    AZJIO
  • 17953
  • Longevity: 1 year 4 months
  • Posts: 186
  • REPUTATION:40

    [+] [-]
Сделал примеры и проверил как вносятся данные:
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
это как?
тфу забыл, переменные которые автоматически раскрываются.

Page 9 of 18


Display posts:    

Current time is: 26-Jun 22:50

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum