如何获取GUID的名称

时间:2016-03-31 05:47:10

标签: visual-c++ directx

我正在使用C ++中的DirectX。我调用的函数给我一个GUID结构作为结果。现在,directx标头的GUID分配如下:

DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG2_MOCOMP,      0xe6a9f44b, 0x61b0, 0x4563,0x9e,0xa4,0x63,0xd2,0xa3,0xc6,0xfe,0x66);

我的问题是如何从GUID获取名称(在这种情况下为D3D11_DECODER_PROFILE_MPEG2_MOCOMP)?

3 个答案:

答案 0 :(得分:1)

AFAIK没有这样的名称,或者只是定义特定视频配置文件的GUID的人类可读名称。

您可以使用字符串创建一个struct数组,并使用GUID进行转换。但请记住,名称本身只是GUID的定义。所以它在C ++代码中是有效的。

struct S_GUID_DECODER {
  char* pName;
  const GUID *pGuid;
} 
aValues[] = 
{
...
  {" D3D11_DECODER_PROFILE_MPEG2_MOCOMP", &D3D11_DECODER_PROFILE_MPEG2_MOCOMP }, 
...
};

现在您可以使用循环并找到“您的”名称。

PS:你的问题不是很清楚,如果你的意思是接口GUID或类ID,或者它只是视频配置文件的这个特殊标识符组。

答案 1 :(得分:0)

D3D11_DECODER_PROFILE_MPEG2_MOCOMP只是GUID的别名。您可以选择任何您喜欢的别名,但不能选择容易重复的简单别名。

  

每个coclass和接口都有它的guid,这是一个128位的数字。为了方便程序员使用,为每个guid定义了一个易记的清单常量。   资料来源:http://progtutorials.tripod.com/COM.htm

答案 2 :(得分:0)

对于那些正在寻找类似结果的人,该代码段来自Microsoft DirectShow示例,但已更改为满足现代Visual Studio要求(vs2019),

主要代码

  

Blockquote

#include <iostream>
#include <guiddef.h>
//#include <initguid.h> --- dont use it, use guiddef.h instead.
#include <cguid.h>

/*  Stuff for printing out our GUID names */
typedef struct {
    const char* szName;
    GUID    guid;
} GUID_STRING_ENTRY;

GUID_STRING_ENTRY g_GuidNames[] = {
#define OUR_GUID_ENTRY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)     { #name, { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } } },
        #include <myuuids.h>
};

class CGuidNameList {
public:
    const char* operator [] (const GUID& guid);
};

extern CGuidNameList GuidNames;

CGuidNameList GuidNames;
int g_cGuidNames = sizeof(g_GuidNames) / sizeof(g_GuidNames[0]);

const char* CGuidNameList::operator [] (const GUID& guid)
{
    for (int i = 0; i < g_cGuidNames; i++) {
        if (g_GuidNames[i].guid == guid) {
            return g_GuidNames[i].szName;
        }
    }
    if (guid == GUID_NULL) {
        return "GUID_NULL";
    }

    // !!! add something to print FOURCC guids?

    // shouldn't this print the hex CLSID?
    return "Unknown GUID Name";
}

int main() {
    // --- what is guid ----
    unsigned long  Data1 = 0xea36eb8e;
    const GUID MEDIASUBTYPE_None = { 0xe436eb8e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 };
    std::cout << MEDIASUBTYPE_None.Data1 << std::endl;

    // --- now get the guid names ----
    std::cout << GuidNames[MEDIASUBTYPE_None] << std::endl;
}
  

Blockquote

uuid.h只是Windows SDK的副本,对我而言,它已安装在计算机中, C:\ Program Files(x86)\ Windows Kits \ 10 \ Include \ 10.0.18362.0 \ shared \ uuids

此文件中唯一的更改是

OUR_GUID_ENTRY(CLSID_SBE2FileScan,
0x3e458037, 0xca6, 0x41aa, 0xa5, 0x94, 0x2a, 0xa6, 0xc0, 0x2d, 0x70, 0x9b) ;

已更改为(删除最后一个“;”,这将给出错误信号)

OUR_GUID_ENTRY(CLSID_SBE2FileScan,
0x3e458037, 0xca6, 0x41aa, 0xa5, 0x94, 0x2a, 0xa6, 0xc0, 0x2d, 0x70, 0x9b) 

希望这会有所帮助。