喫茶XRAYトップページ

[▲前のスレッド]

[11176] DeviceID(GUID)返信 削除
2017/5/7 (日) 09:33:13 Mr.XRAY
[ ハードディスクのGUIDを取得したいのですが ]
https://forums.embarcadero.com/thread.jspa?threadID=249921&tstart=0

こんな感じですね.


[11177] Re:DeviceID(GUID)返信 削除
2017/5/7 (日) 13:07:54 Mr.XRAY
この GUID での DeviceID の値ですが,
COM オブジェクトとしてのエクセルの GUID 値,
あるいは特殊フォルダの GUID の値は,環境による違いはありません.
どの Windows の PC でも同じです.

DeviceID の GUID 値は,環境によって違います.


[11178] Re:DeviceID(GUID)返信 削除
2017/5/7 (日) 21:57:49 Mr.XRAY
あっ,忘れていました.
SetupAPI (SetupDI API?) 関係の関数類がありました.

SetupDiGetDeviceRegistryProperty とかいうやつです.

[Public Device Installation Functions - Windows 10 hardware dev]
https://msdn.microsoft.com/en-us/library/ff549791(v=vs.85).aspx


[11179] ClassID (GUID)返信 削除
2017/5/8 (月) 07:00:02 Mr.XRAY
> SetupAPI (SetupDI API?) 関係の関数類がありました.

SetupAPI を使用すると ClassID の GUID 値が取得できるようです.
CkassID は環境に依存しない値ですから,
皆さんの PC の C ドライブも同じ値になると思います.
以下,参考コードです.
元コードは以下です.

[ドライブ名からデバイス情報を取得する(UsefullCode.net)]
http://www.usefullcode.net/2007/02/post_48.html

Delphi XE(UP1) Pro には SetupAPI は実装されていません.
以下の記事の手順で JEDI API を使用しました.

[475] [パフォーマンスカウンタで CPU の使用率  -  JEDI API の準備]
http://mrxray.on.coocan.jp/Delphi/plSamples/475_CpuUsageRate.htm#00

以下にライブラリのパスを追加しています.
  [Common]
  [Win32API]
  [SaCMAPI]
  [includes]
 
動作確認環境は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.
 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, JwaWindows;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  SetupApi;

{$R *.dfm}

//=============================================================================
//  ドライブの情報の取得
//  JEDI Windows APIのユニットを使用
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);

  //---------------------------------------------------------------------------
  //  引数のAPropertyに相当するプロパティの値を取得する
  //---------------------------------------------------------------------------
  function GetProperty(AhDevInfo: HDEVINFO; ADeviceInfoData:
    TSPDevInfoData; AProperty: DWORD): string;
  var
    LRegDataType : DWORD;
    Lpbuffer     : PByte;
    Lbuffersize  : DWORD;
  begin
    Result := '';

    Lpbuffer := nil;
    Lbuffersize := 0;

    while (not SetupDiGetDeviceRegistryProperty(
         AhDevInfo,
         ADeviceInfoData,
         AProperty,
         LRegDataType,
         Lpbuffer ,
         Lbuffersize,
         Lbuffersize)) do begin
      if (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
        if (Lpbuffer <> nil) then begin
          FreeMemory(Lpbuffer);
        end;
        Lpbuffer := GetMemory(Lbuffersize * SizeOf(Char));
      end else begin
        break;
      end;
    end;

    Result := PChar(Lpbuffer);
    if (Lpbuffer <> nil) then begin
      FreeMemory(Lpbuffer);
    end;
  end;
  //---------------------------------------------------------------------------

var
  LDriveLetter    : string;
  LTargetPath     : array [0..MAX_PATH - 1] of Char;
  LPhysicDevName  : string;
  LhDevInfo       : HDEVINFO;
  LDeviceInfoData : TSPDevInfoData;
  LStrProperty    : string;
  LIndex          : DWORD;
begin
  //DLLのロード
  LoadSetupApi;

  ListBox1.Items.Clear;

  LDriveLetter := 'C:';
  QueryDosDevice(PChar(LDriveLetter), LTargetPath, SizeOf(LTargetPath));
  LPhysicDevName := LTargetPath;
  ListBox1.Items.Add(LDriveLetter);

  LhDevInfo := SetupDiGetClassDevs(nil,
     nil,
     0,
     DIGCF_PRESENT or DIGCF_ALLCLASSES );

  if (Cardinal(LhDevInfo) = INVALID_HANDLE_VALUE) then exit;

  LIndex := 0;

  LDeviceInfoData.cbSize := sizeof(TSPDevInfoData);
  while SetupDiEnumDeviceInfo(LhDevInfo, LIndex, LDeviceInfoData) do begin
    Inc(LIndex);

    LStrProperty := GetProperty(LhDevInfo, LDeviceInfoData,
                                SPDRP_PHYSICAL_DEVICE_OBJECT_NAME);

    //QueryDosDeviceで取得したドライブのパス名と同じなら
    if LStrProperty = LPhysicDevName then begin
      ListBox1.Items.Add(LStrProperty);

      //以下,いろいろなプロパティを取得して表示
      LStrProperty := GetProperty(LhDevInfo, LDeviceInfoData, SPDRP_DEVICEDESC);
      ListBox1.Items.Add(LStrProperty);

      LStrProperty := GetProperty(LhDevInfo, LDeviceInfoData, SPDRP_DRIVER);
      ListBox1.Items.Add(LStrProperty);

      LStrProperty := GetProperty(LhDevInfo, LDeviceInfoData, SPDRP_CLASSGUID);
      ListBox1.Items.Add(LStrProperty);
    end;
  end;

  //後処理
  SetupDiDestroyDeviceInfoList(LhDevInfo);
end;

end.



[11180] Re:ClassID (GUID)返信 削除
2017/5/8 (月) 07:05:21 Mr.XRAY
> 以下,参考コードです.

ソースコード UP しておきます.EXE なしです.

■添付ファイル bbs_11178_hdd_cl.zip

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82