0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[C++] 文字列からGUIDに直す / GUIDの比較

Last updated at Posted at 2021-05-26

もくじ

やりたいこと

指定のGUID({381b4222-f694-41f0-9685-ff5bb260df2e}とかそういうやつ)とほかのGUIDを比較して、一致してるのかどうか、というのを確認したいシーンがあった。

具体的には、Windowsの電力プランの設定で、「バランス」が選択されてるのかどうか、というのを知りたいときに、電力プランはそれぞれGUIDを持っていて、それが一致するかということをしたかったので、GUIDの一致確認をしたかった。

で、その際、guiddef.hというところに定義されているGUID
image.png
を使うのだが、まずここに自分の指定のGUIDを入れるのをどうやるのか?(手動で順番に値をいれるようなことはしたくない)となったので、好きな値をGUIDに入れるのと、GUIDどうしを比較、一致確認する方法を調べた。

やりかた

combaseapi.hに定義されてるCLSIDFromString()という関数を使用して、文字列で書いたGUIDからGUIDをまず作成し、そのあとguiddef.hにあるIsEqualGUID()という関数を使って比較をした。

IsEqualGUID()は、memcmpで中身が全く一緒かどうかを見てるだけっぽい。

サンプル

<combaseapi.h>をinclude必要。
(今回PowerGetActiveScheme()を使うので、一緒に<powersetting.h>もincludeしている)

#pragma comment(lib, "PowrProf.lib")
#include <Windows.h>
#include <powersetting.h>
#include <combaseapi.h>
#include <string>

int main()
{
    GUID srcGuid;
    //GUID srcGuid = { 0x381b4222, 0xf694, 0x41f0, 0x96, 0x85, 0xff, 0x5b, 0xb2, 0x60, 0xdf, 0x2e };
    GUID* targetGuid;
    
    // GUID文字列からGUIDに変換
    CLSIDFromString(L"{381b4222-f694-41f0-9685-ff5bb260df2e}", &srcGuid);//「バランス」の電力プランのGUID

    // 今選んでいる電力プランのGUIDを取得
    PowerGetActiveScheme(NULL , &targetGuid);

    // 比較する
    if (IsEqualGUID(*targetGuid, srcGuid) == TRUE)
    {
        MessageBox(NULL, L"今、バランスの電力プランを使ってます", L"", MB_OK);
    }

    system("pause");
}

追記

CLSIDFromString()を使わなくても、普通に構造体に値を入れる感じで下記のようにすれば任意のGUID値を作ることができる。

    GUID srcGuid = { 0x381b4222, 0xf694, 0x41f0, 0x96, 0x85, 0xff, 0x5b, 0xb2, 0x60, 0xdf, 0x2e };

<combaseapi.h>の関数は、CLSIDFromString()よりも、その逆のStringFromCLSID()とかStringFromGUID2()とかの、GUID⇒stringに直す方がよく使いそうな気がする。

参考

OLECHARはワイド文字列

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?