Características del lenguaje mql5, sutilezas y técnicas - página 198

 
Vladimir Simakov:
Actualización: en la arquitectura x86 - instrucción cpuid prsessor. El msvs tiene __cpuid(int[4],int) y __cpuidex(int[4],int,int). Hay ejemplos disponibles en línea.

Decidí descartar la información del procesador - no muestra nada.

Me he decantado por el disco, o más bien por su partición, ya que no hay forma de determinar el número de todo el dispositivo.

Una duda, ¿los tipos de datos son correctos?

#property strict

#import "kernel32.dll"
bool GetVolumeInformationW(string RootPathName,
                           ushort VolumeNameBuffer,
                           uint VolumeNameSize,
                           uint &VolumeSerialNumber[],
                           uint MaximumComponentLength,
                           uint FileSystemFlags,
                           ushort FileSystemNameBuffer,
                           uint FileSystemNameSize);
#import
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(SystemDriveSerialNumber("C"));
//---
  }
//+------------------------------------------------------------------+

//-------------------------------------------------------------------------------------------------------------------
string SystemDriveSerialNumber(string sDrive)
  {
   uint iVolumeSerialNumber[1]= {0};
   string sVolumeSerialNumber="";
   if(GetVolumeInformationW("C:\\", NULL, 15, iVolumeSerialNumber, 0, 0, NULL, 15))
     {
      sVolumeSerialNumber=IntegerToHexString(iVolumeSerialNumber[0]);
      sVolumeSerialNumber=StringSubstr(sVolumeSerialNumber,0,4)+"-"+StringSubstr(sVolumeSerialNumber,4);
     }
   return(sVolumeSerialNumber);
  }
//+--------------------------------
string IntegerToHexString(uint num)
  {
   char __hex[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
   int len=0,k=0;
   char buff[64];
   do
     {
      uint n=num&0xF;
      buff[len] = __hex[n];
      len++;
      num>>=4;
     }
   while(num!=0);

   for(; k<len/2; k++)
     {
      buff[k]^=buff[len-k-1];
      buff[len-k-1]^=buff[k];
      buff[k]^=buff[len-k-1];
     }
   return CharArrayToString(buff,0,len);
  }
//+------------------------------------------------------------------+
 
Vitaly Muzichenko:

Decidí descartar la información del procesador - no muestra nada.

Me he decantado por el disco, o más bien por su partición, ya que no hay forma de determinar el número de todo el dispositivo.

Tengo una duda, ¿los tipos de datos son correctos?

La identificación de la placa base es correcta.

 
Valeriy Yastremskiy:

La identificación de la placa base es correcta.

¿Hay un ejemplo de código, puede mostrarme?

 
Vitaly Muzichenko:

¿Existe un código de ejemplo, puede mostrarme?

No encuentro el número de serie de la placa en el µl.

wmic baseboard get serialnumber

en cmd

 
Valeriy Yastremskiy:

Cómo obtener el número de serie de la placa en el µl no lo he encontrado.

wmic baseboard get serialnumber

en cmd

Yo tampoco pude encontrarlo.

 
Vitaly Muzichenko:
...

Una duda es si los tipos de datos están escritos correctamente.

#define  BOOL bool
#define  LPWSTR string&
#define  LPCWSTR const LPWSTR
#define  DWORD uint
#define  LPDWORD DWORD&

BOOL GetVolumeInformationW(
  LPCWSTR lpRootPathName,
  LPWSTR  lpVolumeNameBuffer,
  DWORD   nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPWSTR  lpFileSystemNameBuffer,
  DWORD   nFileSystemNameSize
);

De alguna manera)

upd: adaptado a mql-signatures

 
Vladimir Simakov:

De alguna manera)

upd: adaptado para mql-signatures

¿Qué sentido tienen las construcciones #define aplicadas una vez, si se pueden poner tipos en una función de una vez y no estirar el código?

 
Vitaly Muzichenko:

¿Qué sentido tienen las construcciones #define utilizadas una vez, si se pueden poner tipos en una función de una vez y no estirar el código?

la cuestión es que se puede leer y/o utilizar la firma de la función nativa WinAPI

 
Igor Makanu:

el sentido de que es posible leer y/o utilizar una firma de función nativa de WinAPI

Tal vez, pero la pregunta es exactamente esta

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Peculiaridades de mql5, consejos y trucos

Vitaly Muzichenko, 2021.02.28 00:21

¿Para qué sirven las construcciones #define utilizadas una vez, si se pueden escribir inmediatamente los tipos en la función , y no para estirar el código?

¿Hay alguna ventaja en las definiciones?

 
Vladimir Simakov:

De alguna manera)

upd: adaptado para mql-signatures

La biblia WinAPI mql tiene esta función

int  GetVolumeInformationW(
 const string root_path_name,
 ushort &volume_name_buffer[],
 uint volume_name_size,
 uint &volume_serial_number,
 uint &maximum_component_length,
 uint &file_system_flags,
 ushort &file_system_name_buffer[],
 uint file_system_name_size
);

Sus tipos son diferentes, deben ser de C#.

#define  BOOL bool
#define  LPWSTR string&
#define  LPCWSTR const LPWSTR
#define  DWORD uint
#define  LPDWORD DWORD&

BOOL GetVolumeInformationW(
  LPCWSTR lpRootPathName,
  LPWSTR  lpVolumeNameBuffer,
  DWORD   nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPWSTR  lpFileSystemNameBuffer,
  DWORD   nFileSystemNameSize
);

---

Así que mi pregunta es: ¿dónde está lo correcto?

Razón de la queja: