4

我正在使用 Windows 7 音频 API,但我碰壁了。

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

现在,看起来我可以使用IAudioSessionControl2->GetSessionInstanceIdentifier(...)的值调用IAudioSessionManager->GetSimpleAudioVolume( )。请注意,这在文档中并没有完全清楚地说明,但这似乎是一种合理的行为。

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

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


好的,这些 API 肯定不像我在上面的文本转储中所说的那样工作。但是,String -> GUID 的基本问题已得到解答,因此我不会删除该问题。

4

2 回答 2

12

试试CLSIDFromString。ACLSID实际上定义为:

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以完全相同的方式使用。

于 2009-07-14T21:35:49.997 回答
-2

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

于 2013-02-27T02:52:08.790 回答