Caractéristiques du langage mql5, subtilités et techniques - page 198

 
Vladimir Simakov:
Mise à jour : sur l'architecture x86 - instruction cpuid prsessor. Le msvs a __cpuid(int[4],int) et __cpuidex(int[4],int,int). Des exemples sont disponibles en ligne.

J'ai décidé de ne pas tenir compte des informations relatives au processeur - elles ne montrent rien.

J'ai choisi le disque, ou plutôt sa partition, car il n'y a aucun moyen de déterminer le numéro de l'ensemble du périphérique.

Un doute, les types de données sont-ils corrects ?

#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:

J'ai décidé de ne pas tenir compte des informations sur le processeur - elles ne montrent rien.

J'ai choisi le disque, ou plutôt sa partition, car il n'y a aucun moyen de déterminer le numéro de l'ensemble du périphérique.

J'ai un doute, les types de données sont-ils corrects ?

L'ID de la carte mère est correct.

 
Valeriy Yastremskiy:

L'ID de la carte mère est correct.

Existe-t-il un exemple de code, pouvez-vous me le montrer ?

 
Vitaly Muzichenko:

Existe-t-il un exemple de code, pouvez-vous me le montrer ?

Je ne trouve pas le numéro de série de la carte dans le µl.

wmic baseboard get serialnumber

dans cmd

 
Valeriy Yastremskiy:

Je n'ai pas trouvé comment obtenir le numéro de série de la carte dans le µl.

wmic baseboard get serialnumber

dans cmd

Je ne l'ai pas trouvé non plus.

 
Vitaly Muzichenko:
...

Un doute subsiste : les types de données sont-ils écrits correctement ?

#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
);

D'une manière ou d'une autre)

upd : adapté à mql-signatures

 
Vladimir Simakov:

D'une manière ou d'une autre)

upd : adapté pour mql-signatures

Quel est l'intérêt des constructions #define appliquées une fois, si on peut mettre des types dans une fonction en une seule fois et ne pas étirer le code ?

 
Vitaly Muzichenko:

Quel est l'intérêt des constructions #define utilisées une seule fois, si on peut mettre des types dans une fonction en une seule fois et ne pas étirer le code ?

le fait est que vous pouvez lire et/ou utiliser la signature native de la fonction WinAPI.

 
Igor Makanu:

en ce sens qu'il est possible de lire et/ou d'utiliser une signature de fonction native WinAPI

Peut-être, mais la question est exactement la suivante

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Particularités de mql5, trucs et astuces

Vitaly Muzichenko, 2021.02.28 00:21

Quel est le but des constructions #define utilisées une fois, si l'on peut immédiatement écrire les types dans la fonction , et non pas étirer le code?

Les définitions présentent-elles des avantages ?

 
Vladimir Simakov:

D'une manière ou d'une autre)

upd : adapté pour mql-signatures

La bible WinAPI mql a cette fonction

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
);

Vos types sont différents, ils doivent être issus 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
);

---

Ma question est donc : où est le bon ?