Что нового

[Реестр] Отобразить двоичные данные в строку

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Доброго дня.
Проблема.
Был написан скрипт для программы(автоматизация), программа много чего сохраняет, открывает. Т.е. использует стандартное окно сохранить, открыть.
Вот такое
735547504960.png

Сохраняем в одну, открываем в другой. Запоминается последняя с которой работали. неудобно.
Появилась мысль, что это где-то хранится в реестре. нашли.
Код:
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32"
Ветка
Код:
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU"
в бинарном отображении
Ветка
Код:
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU"
в строковом.

Вопрос: как работать с бинарными данными реестра WindowsXP (32 разряда, русская)
Есть код.
Код:
#include "array.au3"
#include "encoding.au3"

$sPath = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU", "MRUList")
;ConsoleWrite( 'Параметр LastVisitedMRU MRUList: ' & $sPath & @LF & 'Тип данных: ' & @extended & @CRLF)
$MASSPath = StringSplit($sPath,"")
;_ArrayDisplay($MASSPath)
For $i = 1 to $MASSPath[0]
	$sPathTemp = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU",  $MASSPath[$i])

	$sPathTempString = BinaryToString($sPathTemp,1)
	ConsoleWrite($sPathTemp & @CRLF)
	ConsoleWrite($sPathTempString & @CRLF)
	ConsoleWrite(@CRLF)
	
Next


Это заготовка.

Если не сложно укажите, где я деляю не так.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
$sPathTempString = BinaryToString($sPathTemp, 2)
 
Автор
СН3СН2ОН

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Да, это работает. Я играл параметрами. Но вся соль в пути, который идет за программой.
Методом научного тыка делал и так
Код:
$sPathTemp = StringReplace($sPathTemp,"00","")
	$sPathTempString = BinaryToString($sPathTemp,1)

Видны пути, но вместо русских букв - пурга. Я знаю, что это -бред.
Просто я не знаю, что это за набор символов, подскажите
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
СН3СН2ОН
Вроде так работает.
Код:
For $j = 97 To 121
	$vReg = RegRead('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU', Chr($j))
	$vReg = Hex($vReg)
	$a_Res = StringRegExp($vReg, '((.{4})+?)0000', 3)
	For $i = 0 To UBound($a_Res) - 1 Step 2
		ConsoleWrite(Chr($j) & ' = ' & BinaryToString('0x' & $a_Res[$i], 2) & @LF)
	Next
	ConsoleWrite('---' & @LF)
Next
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
СН3СН2ОН сказал(а):
Код:
$sPathTemp = StringReplace($sPathTemp,"00","")
	$sPathTempString = BinaryToString($sPathTemp,1)


Код:
$sPathTemp = StringReplace($sPathTemp,"0000","")
    $sPathTempString = BinaryToString($sPathTemp,2)
 
Автор
СН3СН2ОН

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Большое спасибо всем. О результатах чтения, записи допишу здесь позже.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
СН3СН2ОН,
Еще так можно прочитать.
Код:
#include <Array.au3>
#include <WinAPIEx.au3>
#include <APIConstants.au3>

Local $tData = DllStructCreate('wchar[512]'), $tNextData, $hKey, $aRet[26][3], $pData = DllStructGetPtr($tData)

$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU')
If @error Then Exit 13
For $i = 97 To 121
	$aRet[0][0] += 1
	$aRet[$aRet[0][0]][0] = Chr($i)
	If _WinAPI_RegQueryValue($hKey, $aRet[$aRet[0][0]][0], $tData) Then
		$aRet[$aRet[0][0]][1] = DllStructGetData($tData, 1)
		$tNextData = DllStructCreate('wchar[512]', $pData + (StringLen($aRet[$aRet[0][0]][1]) + 1) * 2)
		$aRet[$aRet[0][0]][2] = DllStructGetData($tNextData, 1)
	EndIf
Next
_WinAPI_RegCloseKey($hKey)

_ArrayDisplay($aRet)
Или так.
Код:
#include <Array.au3>
#include <WinAPIEx.au3>
#include <APIConstants.au3>

Local $tData = DllStructCreate('wchar[512]'), $tNextData = DllStructCreate('wchar[512]'), $hKey, $aRet[26][3], $pData = DllStructGetPtr($tData), _
$pNextData = DllStructGetPtr($tNextData)

$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU')
If @error Then Exit 13
For $i = 97 To 121
	$aRet[0][0] += 1
	$aRet[$aRet[0][0]][0] = Chr($i)
	If _WinAPI_RegQueryValue($hKey, $aRet[$aRet[0][0]][0], $tData) Then
		$aRet[$aRet[0][0]][1] = DllStructGetData($tData, 1)
		_WinAPI_MoveMemory($pNextData, $pData + (StringLen($aRet[$aRet[0][0]][1]) + 1) * 2, 512)
		$aRet[$aRet[0][0]][2] = DllStructGetData($tNextData, 1)
	EndIf
Next
_WinAPI_RegCloseKey($hKey)

_ArrayDisplay($aRet)
 
Верх