IWbemServices

WMIへの具体的な操作は、IWbemServicesインターフェースを通して行う。

IWbemServices (wbemcli.h) - Win32 apps | Microsoft Docs

IWbemServices.cppで、

とりあえず取得したIWbemServicesインターフェースポインタを出力だけ。

CoCreateInstance OK!
pLocator = 0x01e30828
pLocator->ConnectServer OK!
pServices = 0x01e3cfb4
続行するには何かキーを押してください . . .

こうなる。

Sample/com/IWbemServices/IWbemServices/src/IWbemServices at master · bg1bgst333/Sample · GitHub

IWbemLocator::ConnectServer

IWbemLocator::ConnectServerで、WMIへ接続する。

IWbemLocator::ConnectServer (wbemcli.h) - Win32 apps | Microsoft Docs
例: ローカルコンピューターから WMI データを取得する - Win32 apps | Microsoft Docs

IWbemLocator.cppで、

ConnectServerの第1引数にはBSTRで"ROOT\\CIMV2"、第8引数は受け取るIWbemServicesポインタのアドレス。

CoCreateInstance OK!
pLocator = 0x01ef0828
pLocator->ConnectServer OK!
続行するには何かキーを押してください . . .

成功。

Sample/com/IWbemLocator/ConnectServer/src/IWbemLocator at master · bg1bgst333/Sample · GitHub

BSTR

BSTRは、表面上ワイド文字だが、文字列本体の前には文字列のバイト数、文字列本体の後には2バイトのNULL終端があるので、全く同じに扱うことはできない。

SysAllocString function (oleauto.h) - Win32 apps | Microsoft Docs
BSTR 用のメモリの割り当てと解放 | Microsoft Docs
BSTR とは? - Windows 徹底解説 - Web/DB プログラミング徹底解説

バイト数や2バイトNULL終端があるかを確認する。
BSTR.cppで、

str - 2は、BSTR分2つ前だから4バイト前を指す。
str[5]は、最後の要素からBSTR1つ後だから2バイト後を指す。

ABCDE
str[-1] = 10
str[0] = 0x00000041
str[1] = 0x00000042
str[2] = 0x00000043
str[3] = 0x00000044
str[4] = 0x00000045
str[5] = 0x00000000
続行するには何かキーを押してください . . .

"ABCDE"は5文字なので10バイト。
確かに手前に10が入ってる。
後ろもNULL終端されてる。

Sample/com/BSTR/BSTR/src/BSTR at master · bg1bgst333/Sample · GitHub

SysAllocString

COM用のBSTR文字列を扱う必要が出てきたので、SysAllocStringについて。
BSTR文字列を扱うには、SysAllocStringでメモリを確保し、文字列をセットする。

SysAllocString function (oleauto.h) - Win32 apps | Microsoft Docs
BSTR 用のメモリの割り当てと解放 | Microsoft Docs
BSTR とは? - Windows 徹底解説 - Web/DB プログラミング徹底解説

SysAllocString.cppで、

BSTR型文字列は表面上はワイド文字。

ABCDE
続行するには何かキーを押してください . . .

なのでwprintfで出力できる。
ただ、SysAllocStringで確保したので、SysFreeStringで解放が必要。

Sample/com/SysAllocString/SysAllocString/src/SysAllocString at master · bg1bgst333/Sample · GitHub

IWbemLocator

IWbemLocatorは、WMIに接続するためのインターフェース。

IWbemLocator (wbemcli.h) - Win32 apps | Microsoft Docs
例: ローカルコンピューターから WMI データを取得する - Win32 apps | Microsoft Docs

前回、成功したのはわかったけど、取得したポインタを示してなかったので、
IWbemLocator.cppで、

とすると、

CoCreateInstance OK!
pLocator = 0x01fa0828
続行するには何かキーを押してください . . .

取得したpLocatorを出力。

Sample/com/IWbemLocator/IWbemLocator/src/IWbemLocator at master · bg1bgst333/Sample · GitHub

CoCreateInstance

CoCreateInstanceで、COMインターフェースポインタを生成・取得する。

CoCreateInstance function (combaseapi.h) - Win32 apps | Microsoft Docs

WMIで使うIWbemLocatorインターフェースポインタを生成・取得する。

wbemuuid.libをリンク
wbemuuid.libをリンク

wbemuuid.libをリンク。

こんな感じでpLocatorを取得する。
終わったら、pLocator->Releaseで解放。

CoCreateInstance OK!
続行するには何かキーを押してください . . .

成功した模様。

Sample/com/CoCreateInstance/CoCreateInstance/src/CoCreateInstance at master · bg1bgst333/Sample · GitHub

FAILED

FAILEDは、エラーによる失敗の時だけ真になる。

FAILED macro (winerror.h) - Win32 apps | Microsoft Docs

FAILED.cppで、

CoInitializeSecurityにでたらめな引数を与えたら、エラーになるだろうから、FAILEDで判定する。

SUCCEEDED!
FAILED!
続行するには何かキーを押してください . . .

やはりFAILEDになった。

Sample/com/FAILED/FAILED/src/FAILED at master · bg1bgst333/Sample · GitHub