mql5语言的特点、微妙之处以及技巧 - 页 198

 
Vladimir Simakov:
更新:在x86架构上--cpuid prsessor指令。msvs中有__cpuid(int[4],int)和__cpuidex(int[4],int,int)。例子可以在网上找到。

决定放弃处理器的信息--它没有显示任何东西。

我已经确定了磁盘,或者说它的分区,因为没有办法确定整个设备的编号。

有一个疑问,数据类型 是否正确?

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

决定放弃处理器的信息--它没有显示任何东西。

我已经确定了磁盘,或者说它的分区,因为没有办法确定整个设备的编号。

我有一个疑问,数据类型 是否正确?

主板的ID是正确的。

 
Valeriy Yastremskiy:

主板的ID是正确的。

是否有一个代码例子,你能给我看看吗?

 
Vitaly Muzichenko:

是否有示例代码,你能给我看看吗?

我在μl中找不到电路板的序列号。

wmic 基板获取序列号

在cmd中

 
Valeriy Yastremskiy:

如何获得μl中的电路板序列号,我没有找到。

wmic 基板获取序列号

在cmd中

我也找不到它。

 
Vitaly Muzichenko:
...

一个疑问是数据类型 是否写得正确?

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

某种程度上)。

更新:适应于mql-signatures

 
Vladimir Simakov:

某种程度上)。

更新:适应于mql-signatures

如果你可以一次性将类型放入一个函数而不拉伸代码,那么#define结构应用一次的意义何在?

 
Vitaly Muzichenko:

如果你可以一次性将类型放入一个函数中而不拉长代码,那么#define结构使用一次的意义何在?

重点是,你可以读取和/或使用本地WinAPI函数签名

 
Igor Makanu:

在这个意义上,有可能读取和/或使用一个本地的WinAPI函数签名

也许吧,但问题恰恰在于此

关于交易、自动交易系统和策略测试的论坛

mql5的特殊性,技巧和窍门

Vitaly Muzichenko, 2021.02.28 00:21

如果你可以立即在函数中写出类型 那么#define结构使用一次 有什么用,而不是为了拉长代码

防守有什么好处吗?

 
Vladimir Simakov:

某种程度上)。

更新:适应于mql-signatures

WinAPI mql圣经有这样的功能

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

你的类型是不同的,它们一定是来自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
);

---

所以我的问题是:哪里是正确的?