Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 198

 
Vladimir Simakov:
Aktualisierung: auf x86 Architektur - cpuid prsessor Anweisung. Die msvs hat __cpuid(int[4],int) und __cpuidex(int[4],int,int). Beispiele sind online verfügbar.

Ich habe beschlossen, die Prozessorinformationen zu verwerfen - sie zeigen nichts an.

Ich habe mich für die Festplatte bzw. ihre Partition entschieden, da es keine Möglichkeit gibt, die Nummer des gesamten Geräts zu ermitteln.

Eine Frage: Sind die Datentypen korrekt?

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

Ich habe beschlossen, die Prozessorinformationen zu verwerfen - sie zeigen nichts an.

Ich habe mich für die Festplatte bzw. ihre Partition entschieden, da es keine Möglichkeit gibt, die Nummer des gesamten Geräts zu ermitteln.

Ich habe einen Zweifel: Sind die Datentypen korrekt?

Die Motherboard-ID ist korrekt.

 
Valeriy Yastremskiy:

Die Motherboard-ID ist korrekt.

Gibt es ein Codebeispiel, das Sie mir zeigen können?

 
Vitaly Muzichenko:

Gibt es einen Beispielcode, können Sie ihn mir zeigen?

Ich kann die Seriennummer der Karte im µl nicht finden.

wmic baseboard get serialnumber

in cmd

 
Valeriy Yastremskiy:

Wie man die Seriennummer des Boards im µl erhält, habe ich nicht gefunden.

wmic baseboard get serialnumber

in cmd

Ich konnte sie auch nicht finden.

 
Vitaly Muzichenko:
...

Ein Zweifel ist, ob die Datentypen richtig geschrieben sind?

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

Irgendwie)

upd: angepasst an mql-Signaturen

 
Vladimir Simakov:

Irgendwie)

upd: angepasst für mql-Signaturen

Welchen Sinn haben einmal angewendete #define-Konstruktionen, wenn man Typen auf einmal in eine Funktion einfügen kann, ohne den Code zu strecken?

 
Vitaly Muzichenko:

Welchen Sinn haben #define-Konstruktionen, die einmal verwendet werden, wenn man Typen auf einmal in eine Funktion einfügen kann, ohne den Code zu dehnen?

der Punkt ist, dass Sie die native WinAPI-Funktionssignatur lesen und/oder verwenden können

 
Igor Makanu:

in dem Sinne, dass es möglich ist, eine native WinAPI-Funktionssignatur zu lesen und/oder zu verwenden

Vielleicht, aber die Frage ist genau diese

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Eigenheiten von mql5, Tipps und Tricks

Vitaly Muzichenko, 2021.02.28 00:21

Was nützen einmal verwendete#define-Konstruktionen, wenn man die Typen sofort in die Funktion schreiben kann , ohne den Code zu dehnen?

Gibt es einen Vorteil von Definitionen?

 
Vladimir Simakov:

Irgendwie)

upd: angepasst für mql-Signaturen

WinAPI mql bible hat diese Funktion

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

Ihre Typen sind anders, sie müssen aus C# sein.

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

---

Meine Frage ist also: Wo ist es richtig?