我正在使用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)?
答案 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)
希望这会有所帮助。