如何将LPWSTR转换为GUID?

4
我正在使用Windows 7音频API,但遇到了困难。基本上,我需要取出IAudioSessionControl2*并从中获取ISimpleAudioVolume*。

现在,看起来我可以使用IAudioSessionManager->GetSimpleAudioVolume()IAudioSessionControl2->GetSessionInstanceIdentifier(...)的值来调用它。请注意,虽然文档中没有明确说明,但这似乎是一个合理的行为。

问题是,GetSimpleAudioVolume()需要一个GUID*,而GetSessionInstanceIdentifier()则输出LPWSTR。通过调试,我已确认从GetSessionInstanceIdentifier()返回的值至少看起来像一个GUID。

所以,实际问题是如何将我拥有的LPWSTR转换为GUID?我意识到如果跨越到一些托管代码并使用内置的GUID,这相当琐碎,但肯定有一种C++的方法可以做到这一点。


好的,这些API明显不按照上面的文本转储所说的那样工作。然而,关于字符串 -> GUID 的基本问题已经得到解答,因此我不会删除这个问题。


1
Kevin,IAudioSessionManager->GetSimpleAudioVolume不接受会话ID。请,千万不要试图将会话标识符(或实例标识符)视为其他任何东西,而应将其视为不透明字符串。会话标识符的格式随时可能会发生更改(例如,在Vista和Win7之间的ID字符串中存在细微变化)。 - Larry Osterman
是的,很快就明显地发现我“做错了”。 - Kevin Montrose
2个回答

14

尝试使用CLSIDFromString。实际上, CLSID 的定义如下:

<code>typedef GUID CLSID;
</code>

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

<code>LPWSTR guidstr;
GUID guid;

...

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

警告

不是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


6
请注意,这种方法并不一定有效。尽管CLSIDs和GUIDs在语法上是相同的,但它们之间的关系不是一一对应的。并非每个GUID也都是(有效的)CLSID。因此,该函数可能无法处理非CLSID GUIDs。 - Tom
@Tom,你能想到任何一个GUID({xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}),根据CLSIDFromString无法解析为有效的CLSID吗? - Ian Boyd
@Tom 每个 GUID(除了NULLGUID可能)都是一个有效的CLSID。实际上,对于一个有效的GUID字符串,即使该字符串不表示一个已知的CLSIDCLSIDFromString也不会出现任何可能失败的情况。GUIDCLSIDIID是同一样东西,在不同的命名空间中有不同的含义。 - IInspectable

-2

CLSIDFromString的文档现在指向StringFromGUID2(),它更容易使用...并且不认为这个东西是一个CLSID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接