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 baseboard get serialnumber

cmdで

 
Valeriy Yastremskiy:

μlのボードのシリアルナンバーを取得する方法がわかりません。

wmic baseboard get serialnumber

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

なんとなく)

update: mql-signatureに適応されました。

 
Vladimir Simakov:

なんとなく)

update: mql-signatureに適応されました。

一度に関数に型を入れればコードが伸びないのに、#define構文を一度適用する意味はあるのでしょうか?

 
Vitaly Muzichenko:

一度に関数に型を入れればコードが伸びないのに、#define構文を一回使う意味はあるのでしょうか?

ポイントは、ネイティブのWinAPI関数シグネチャを読む、または使うことができることです。

 
Igor Makanu:

ネイティブのWinAPI関数シグネチャの読み取りや使用が可能であるという意味で

そうかもしれませんが、問題はまさにこれです

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

mql5の特性、ヒントとコツ

ヴィタリー・ムジチェンコ, 2021.02.28 00:21

一度だけ使われた#define構文は、すぐに関数に型を書けるなら、コードを引き伸ばす こともなく、何のためにあるのでしょうか?

ディフェンスのメリットは何かありますか?

 
Vladimir Simakov:

なんとなく)

update: mql-signatureに適応されました。

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

---

そこで質問なのですが、どこが正しいのでしょうか?

理由: