|
▼ひよひよさん:
>残念ながら WSH -> C++ を簡単に出来ませんでした。WSH と C++ に精通した方々のアドヴァイスお待ちしております。基本的には、置き換えるだけのはずなのですが…。
やってることは
・Win32_LogicalDiskでA〜Zのドライブ名ベースのリストからHDD(DriveType=3)だけリストアップ(この指定が無いとFDや光学といったデバイスも動く)
http://msdn2.microsoft.com/en-us/library/aa394173(VS.85).aspx
・Win32_DiskPartitionでディスクパーティションをリストアップ
http://msdn2.microsoft.com/en-us/library/aa394135(VS.85).aspx
・Win32_LogicalDiskToPartitionで上記2つのリストから総当りで組み合わせて解決できるかを実際に試行
http://msdn2.microsoft.com/en-us/library/aa394175(VS.85).aspx
・エラーにならず解決できたらその組み合わせは正しいし、エラーなら違うので無視
という、あまりスマートではないかもしれない方法ですね。
未だにVB6使いなので↓のように移植してますが確かに動作してるようで。
コメント付けましたが言語が違うので無意味かも。全角スペースでインデントされてます。
# 余談ですが、あのWSHを動かすならコマンドプロンプトでcscript 〜.jsのように実行した方がメッセージボックスが出ないので快適です。
'長いので文字列一時保存用
Dim buf As String
'WMIサービスに接続する。
Dim svc As Object
Set svc = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\CIMV2")
'WMIより論理ドライブ名ベースの固定ディスク一覧を取得
Dim objEnumLogicalDisk As Object
Set objEnumLogicalDisk = svc.execQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3", "WQL", 0)
'WMIよりディスクのパーティションテーブル一覧を取得
Dim objEnumDiskPartition As Object
Set objEnumDiskPartition = svc.execQuery("SELECT * FROM Win32_DiskPartition", "WQL", 0)
'For Each用
Dim Disk As Object, Partition As Object
'Win32_LogicalDiskToPartitionの受け皿(使い捨て)
Dim objLogicalDiskToPartition As Object
'総当りチェック開始
For Each Disk In objEnumLogicalDisk
For Each Partition In objEnumDiskPartition
'このDiskとPartitionの組み合わせが正しいかWin32_LogicalDiskToPartitionを使って実際に総当りでやってみる
buf = "Win32_LogicalDiskToPartition.Antecedent='" & Partition.path_.relpath & "',Dependent='" & Disk.path_.relpath & "'"
'try catchが使えるならもうちょいスッキリする
'try{
On Error Resume Next
'実際にやってみる
Set objLogicalDiskToPartition = svc.get(buf, 0)
'エラーなし>この組み合わせはどうやら正しいようだ
If Err.Number = 0 Then
'ドライブレター対応追加処理をここに書く
Debug.Print objLogicalDiskToPartition.path_.relpath
End If
On Error GoTo 0
'}catch(e){}
Next
Next
|
|