Чтение системного реестра из MQL

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Sergey Kravchuk
3190
Sergey Kravchuk  
Нужно мне читать (и писать) данные из (в) системного реестра. В качестве примера взято чтение значение ветки реестра, с именем папки "Мои документы" для текущего пользователя. Есть работающий код в VBA. Есть его "перевод" в MQL. Но что то там не так с передачей параметров :( Скрипт при открытии ключа реестра возвращает ошибку ERROR_INVALID_PARAMETER = 87 Скорее всего строка с именем ключа и значения передается в DLL как-то не правильно. Помогите довести скрип до рабочего состояния. Во вложенном архиве 3 файла: ReadRegistry.bas - исходник VBA ReadRegistry.mq4 - исходник MQL ReadRegistry.xls - EXCEL-евский файл с работающим макросом (ReadRegistry.bas)
Файлы:
Yuriy Zaytsev
18900
Yuriy Zaytsev  
ForexTools:
Нужно мне читать (и писать) данные из (в) системного реестра. В качестве примера взято чтение значение ветки реестра, с именем папки "Мои документы" для текущего пользователя. Есть работающий код в VBA. Есть его "перевод" в MQL. Но что то там не так с передачей параметров :( Скрипт при открытии ключа реестра возвращает ошибку ERROR_INVALID_PARAMETER = 87 Скорее всего строка с именем ключа и значения передается в DLL как-то не правильно. Помогите довести скрип до рабочего состояния. Во вложенном архиве 3 файла: ReadRegistry.bas - исходник VBA ReadRegistry.mq4 - исходник MQL ReadRegistry.xls - EXCEL-евский файл с работающим макросом (ReadRegistry.bas)

Можно использовать API
Sergey Kravchuk
3190
Sergey Kravchuk  

Можно использовать API

Спасибо за содержательный совет :D .... Именно его то я и использую, однако вся беда в том что он не хочет использоваться правильно ;)
В VBA - все работает правильно, а в MQL - нет.
Dmitry Fedoseev
57630
Dmitry Fedoseev  
Может быть вместо строковых переменных использовать массивы int (здесь потребуется цифры преобразовывать в знаки, может быть и наоборот) передаваемые по ссылке, вместо простых переменных передаваемых по ссылке использовать тоже массив в размером 1. Вобщем больше поле для экспериментов.
Sergey Kravchuk
3190
Sergey Kravchuk  
Integer:
Может быть вместо ........
....Вобщем больше поле для экспериментов.

Ох-ох-ох... Все правильно - именно в этом направлении нужно копать. Вся беда в том, что отличии от моего отличного знания MQL, с dll и особенностями системного програмирования связанного с ним у меня туго :( Все что мог я уже сделал и наэкспериментировался "по самое немогу".
Именно поэтому я обратился за помощью к сообществу - тот кто ЗНАЕТ как нужно сделать - просто поправит текст и сделает все за почасика (я надеюсь). Я уже видел нечто то похожее (использование win32 API в MQL для чтения INI-файлов, но там немного проще с параметрами). Вот на таких знатоков и надеюсь.
Dmitry Fedoseev
57630
Dmitry Fedoseev  
На подобные вещи здесь и знатоки тратили как минимум по 3 дня. А потом никому не говорили как. Строки в длл вроде передаются обычныцм способом. Надо для возвращаемых строк массивы сделать, однако в функци размер возвращаемой строки не указывается - это вопрос - какой длины массив использовать. Для начала потренироваться с открытием и закрытием ключа, потом с его установкой - результат смотерть через редактор реестра regedit, ну а потом самое веселое - чтение ключа. С удовольствием бы посидел над этим делом, да время нету.
Sergey Kravchuk
3190
Sergey Kravchuk  

А ларчик просто запирается ;) Вот что написано в документации MQL:

int - Внутреннее представление - длинное целое число размером 4 байта.
Целые константы могут принимать значения от -2147483648 до 2147483647.
Если константа превышает указанный диапазон, то результат не определен.


Значение передаваемой константы 0x80000002 (HKEY_LOCAL_MACHINE) составляет 2147483650 что больше предельно допустимого.
Нет видать в MQL БЕЗзнакового целого :(

2147483647 = 0x7FFFFFFF

Кто нибудь знает как сформировать 4 байта с содержимым 0x80000002 (беззнаковое целое) и передать их во внешнюю функцию ?

нечто вроде:

string HomeKey[4]; 
HomeKey[0]=CharToStr(0x0);
HomeKey[1]=CharToStr(0x2);
HomeKey[2]=CharToStr(0x80);
HomeKey[3]=CharToStr(0x0);






Igor Kim
2729
Igor Kim  

Как вариант выхода из этого тупика могу предложить использовать свою DLL, в которую передавать только наименование ветки реестра и наименование параметра, а константу HKEY_LOCAL_MACHINE использовать только внутри DLL и не гонять её через MQL4.

Dmitry Fedoseev
57630
Dmitry Fedoseev  
ForexTools:

А ларчик просто запирается ;) Вот что написано в документации MQL:

int - Внутреннее представление - длинное целое число размером 4 байта.
Целые константы могут принимать значения от -2147483648 до 2147483647.
Если константа превышает указанный диапазон, то результат не определен.


Значение передаваемой константы 0x80000002 (HKEY_LOCAL_MACHINE) составляет 2147483650 что больше предельно допустимого.
Нет видать в MQL БЕЗзнакового целого :(

2147483647 = 0x7FFFFFFF

Кто нибудь знает как сформировать 4 байта с содержимым 0x80000002 (беззнаковое целое) и передать их во внешнюю функцию ?


Тогда в переменной не передавть константу, а сразу указывать ее при вызове функции API.
Sergey Kravchuk
3190
Sergey Kravchuk  
ForexTools писал (а):
А ларчик просто запирается ;) ...

Еще один возможный глюк в передаче - это передача строки в виде строки в формате ASCII (по одному байту на символ) или UNICODE (по 2). Я правда пробовал и RegOpenKeyW + RegQueryValueExSW (для UNICODE), но все равно получал теже самые 87.

И самый последний вариант непонятностей: передача строки в паксалевском (длинна строки + символы строки) формате или Сишном (символы строки заканчивающиеся нулем).

Slava
Модератор
13476
Slava  

Стандартные грабли при описании строки с директорием (с обратным слешем) на языках C, C++ и им подобным.

Строка "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" должна на самом деле выглядеть так

"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"

СЛЕШ ДОЛЖЕН БЫТЬ ДВОЙНЫМ!!! читайте доки, ибо они - рулез

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий