如何将LPWSTR转换为GUID?

时间:2009-07-14 21:33:05

标签: c++ string windows-7 guid

我正在使用Windows 7音频API,而且我已经碰壁了。

基本上,我需要IAudioSessionControl2 *并从中获取ISimpleAudioVolume *。

现在,看起来我可以使用IAudioSessionManager->GetSimpleAudioVolume()的值来呼叫IAudioSessionControl2->GetSessionInstanceIdentifier(...)。请注意,这在文档中并没有完全拼写出来,但它似乎是一种合理的行为。

问题,GetSimpleAudioVolume()接受GUID *和GetSessionInstanceIdentifier()吐出LPWSTR。通过调试,我已经确认GetSessionInstanceIdentifier()的返回值至少看起来像一样

所以,实际问题是如何将我已经进入GUID的LPWSTR转换成?我意识到如果我编组一些托管代码并使用内置的GUID,这是非常微不足道的,但是必须采用C ++方式来实现这一点。


好的,这些API肯定不像我在上面的文本转储中所说的那样工作。但是,String的基本问题 - >回答GUID所以我不打算删除这个问题。

2 个答案:

答案 0 :(得分:11)

试试CLSIDFromStringCLSID实际上定义为:

typedef GUID CLSID;

因此您可以使用CLSIDFromString生成GUID。这是一些示例代码:

LPWSTR guidstr;
GUID guid;

...

HRESULT hr = CLSIDFromString(guidstr, (LPCLSID)&guid);
if (hr != S_OK) {
    // bad GUID string...
    ...
}

警告

非GUID的内容将作为有效GUID返回。例如:

| String              | Returned Clsid                         |
|---------------------|----------------------------------------|
| "file"              | {00000303-0000-0000-C000-000000000046} | FileMoniker
| "AccessControlList" | {b85ea052-9bdd-11d0-852c-00c04fd8d503} |
| "ADODB.Record"      | {00000560-0000-0010-8000-00AA006D2EA4} |
| "m"                 | {4ED063C9-4A0B-4B44-A9DC-23AFF424A0D3} | Toolbar.MySearchDial

这意味着除了返回您不期望的结果外,该函数每次运行时都会命中注册表。

简短版本:不要使用CLSIDFromString。相反,您可以以完全相同的方式使用IIDFromString

答案 1 :(得分:-2)

CLSIDFromString文档现在指向StringFromGUID2(),它更易于使用......并且不认为该东西是CLSID。