Ушел вчера с работы в 9 вечера. Вот обьясните мне, дураку, какого черта DirectX в режиме Unicode (вызов функции с концовочкой W) возвращает строки хоть и 2-байтовые, но в кодировке ANSI? Звучит дико, но однако работает вот такое:
// вызов DirectX, передает в DSoundEnumCallback описание каждого звукового устройства
DirectSoundCaptureEnumerateW((LPDSENUMCALLBACKW)DSoundEnumCallback,(void*)&devices);

/* внутри DSoundEnumCallback:
    char* strDesc - описание устройства, при указанном вызове будет указывать на мультибайтную строку.*/
size_t wlen = wcslen((wchar_t*)strDesc);
size_t len = (wlen+1) * sizeof(char);
char * buf = new char[len];

/*WideCharToMultiByte переводит строчку из 2-байтовой в однобайтовую с использованием указанной кодировки.
    CP_ACP - ANSI-кодировка, для UTF8 надо использовать CP_UTF8*/
int n = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)strDesc, wlen, buf, wlen, NULL, NULL);

А в используемой нами библиотеке вызов при конвертации правильный, с правильной кодовой страницей...