Как мне конвертировать LPWSTR в GUID? - PullRequest
4 голосов
/ 15 июля 2009

Я работаю с аудиоинтерфейсами Windows 7 и столкнулся со стеной.

По сути, мне нужно взять IAudioSessionControl2 * и получить ISimpleAudioVolume * из него.

Теперь, похоже, я могу вызвать IAudioSessionManager-> GetSimpleAudioVolume () , используя значение IAudioSessionControl2-> GetSessionInstanceIdentifier (...) . Обратите внимание, что в документах это точно не прописано, но кажется разумным.

Проблема, GetSimpleAudioVolume () принимает GUID *, а GetSessionInstanceIdentifier () выплевывает LPWSTR. Посредством отладки я подтвердил, что возвращаемое значение из GetSessionInstanceIdentifier () по крайней мере выглядит как GUID.

Итак, вопрос в том, как мне преобразовать LPWSTR, который у меня есть, в GUID? Я понимаю, что это довольно тривиально, если я перебираю какой-то управляемый код и использую встроенный GUID , но должен быть способ C ++ для этого.


Хорошо, эти API определенно не работают так, как я говорю, что они работают в приведенном выше текстовом дампе. Тем не менее, на основной вопрос String -> GUID дан ответ, поэтому я не собираюсь удалять вопрос.

Ответы [ 2 ]

11 голосов
/ 15 июля 2009

Попробуйте CLSIDFromString. A CLSID фактически определяется как:

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 точно таким же образом.

0 голосов
/ 27 февраля 2013

Документы CLSIDFromString теперь указывают на StringFromGUID2 (), который проще в использовании ... и не думает, что это CLSID.

...