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

 
Vitaly Muzichenko:

Попросить разработчиков чтобы выпустили=)

В комментарии: 

Работает и в MT4 и в MT5.

В коде:

Только для 64-разрядного терминала
 

Это означает, что для 32-разрядного терминала эту строку нужно убрать.

 
Koldun Zloy:

Работает и в MT4 и в MT5.

Благодарю. в мт5 работает.
Но проблема не решена для мт4. Проверили на нескольких компах.
В моей версии та же проблема.

Файлы:
 

А Вы запустите 32-разрядный редактор реестра и увидите, что там нет этого значения.

Для доступа из 32-разрядной среды к 64-разрядному реестру нужно использовать функцию RegOpenKeyEx.

#include <WinDef.mqh>

#define HKEY PVOID

#define HKEY_CLASSES_ROOT                   (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )
#define HKEY_CURRENT_USER                   (( HKEY ) (ULONG_PTR)((LONG)0x80000001) )
#define HKEY_LOCAL_MACHINE                  (( HKEY ) (ULONG_PTR)((LONG)0x80000002) )
#define HKEY_USERS                          (( HKEY ) (ULONG_PTR)((LONG)0x80000003) )
#define HKEY_PERFORMANCE_DATA               (( HKEY ) (ULONG_PTR)((LONG)0x80000004) )
#define HKEY_PERFORMANCE_TEXT               (( HKEY ) (ULONG_PTR)((LONG)0x80000050) )
#define HKEY_PERFORMANCE_NLSTEXT            (( HKEY ) (ULONG_PTR)((LONG)0x80000060) )
#define KEY_WOW64_64KEY         (0x0100)
#define KEY_QUERY_VALUE         (0x0001)


#define REG_NONE                    ( 0 )   // No value type
#define REG_SZ                      ( 1 )   // Unicode nul terminated string
#define REG_EXPAND_SZ               ( 2 )   // Unicode nul terminated string
                                            // (with environment variable references)
#define REG_BINARY                  ( 3 )   // Free form binary
#define REG_DWORD                   ( 4 )   // 32-bit number
#define REG_DWORD_LITTLE_ENDIAN     ( 4 )   // 32-bit number (same as REG_DWORD)
#define REG_DWORD_BIG_ENDIAN        ( 5 )   // 32-bit number
#define REG_LINK                    ( 6 )   // Symbolic Link (unicode)
#define REG_MULTI_SZ                ( 7 )   // Multiple Unicode strings
#define REG_RESOURCE_LIST           ( 8 )   // Resource list in the resource map
#define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )  // Resource list in the hardware description
#define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
#define REG_QWORD                   ( 11 )  // 64-bit number
#define REG_QWORD_LITTLE_ENDIAN     ( 11 )  // 64-bit number (same as REG_QWORD)

#define FORMAT_MESSAGE_IGNORE_INSERTS  0x00000200
#define FORMAT_MESSAGE_FROM_HMODULE    0x00000800
#define FORMAT_MESSAGE_FROM_SYSTEM     0x00001000

#define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))

#define LANG_NEUTRAL                     0x00
#define SUBLANG_DEFAULT                  0x01    // user default
#define SUBLANG_SYS_DEFAULT              0x02    // system default

#define LANG_SYSTEM_DEFAULT    (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
#define LANG_USER_DEFAULT      (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))


#import "advapi32.dll"
   uint RegOpenKeyW( HKEY hKey, const string lpSubKey, HKEY& phkResult );
   uint RegOpenKeyExW( HKEY hKey, const string lpSubKey, DWORD ulOptions, DWORD samDesired, HKEY& phkResult );
   uint RegCloseKey( HKEY hKey );
   uint RegQueryValueExW( HKEY hKey, const string lpValueName, PVOID lpReserved, uint& lpType, ushort& lpData[], uint& lpcbData );
   uint RegQueryValueExW( HKEY hKey, const string lpValueName, PVOID lpReserved, uint& lpType, PVOID lpData, uint& lpcbData );
#import "Kernel32.dll"
   uint FormatMessageW( DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, ushort& lpBuffer[], DWORD nSize, PVOID Arguments );
#import

ushort buffer[256];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string Res = GetRegString( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGuid" );
   Print( Res );
   MessageBox( Res );
}
//+------------------------------------------------------------------+
string GetRegString( HKEY HomeKey, string KeyName, string ValueName )
{
   string sValue;          // Результат
   HKEY hkey;              // Handle раздела реестра
   
   uint lres = RegOpenKeyExW( HomeKey, KeyName, 0, KEY_QUERY_VALUE|KEY_WOW64_64KEY, hkey ); // Открываем Раздел
   
   Print( "RegOpenKey ret code = " + ErrorString( lres ) );
   if( lres != 0 ){
      return sValue;       // Если вернулся не ноль - ошибка, выходим
   }
   
   uint lDlen = 0;          // переменная для хранения длины строки
   uint lDataType = 0;      // Тип возвращаемого значения
   
   lres = RegQueryValueExW( hkey, ValueName, 0, lDataType, 0, lDlen ); // Получаем длину строки
   
   Print( "RegQueryValueEx ret code = " + ErrorString( lres ) );
   
   if( lres == 0 && lDlen > 0 && ((lDataType == REG_SZ) || (lDataType == REG_EXPAND_SZ)) )
   {
      ushort sData[];
      ArrayResize( sData, lDlen / 2 );
      
      lres = RegQueryValueExW( hkey, ValueName, 0, lDataType, sData, lDlen ); // Читаем значение
      
      sValue = ShortArrayToString( sData );
   }
   RegCloseKey( hkey );
   
   return sValue;
}
//+------------------------------------------------------------------+
string ErrorString( uint code )
{
   uint len = FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, code, LANG_SYSTEM_DEFAULT, buffer, 256, 0 );
   if( len ){
      return ShortArrayToString( buffer );
   }
   return "Неизвестная ошибка";
}
//+------------------------------------------------------------------+
 
Koldun Zloy:

А Вы запустите 32-разрядный редактор реестра и увидите, что там нет этого значения.

Для доступа из 32-разрядной среды к 64-разрядному реестру нужно использовать функцию RegOpenKeyEx.

Спасибо.

Желающие могут присоединиться. 

 
Koldun Zloy:

А Вы запустите 32-разрядный редактор реестра и увидите, что там нет этого значения.

Для доступа из 32-разрядной среды к 64-разрядному реестру нужно использовать функцию RegOpenKeyEx.

Я пробовал функцию RegOpenKeyEx, но видать где то ошибся... проверю в своем коде.
Благодарю за ответ!