从C#字符串转换为C ++ wchar_t [unmanaged]

时间:2015-12-01 09:48:44

标签: c# c++ windows-runtime

我正在使用WinRT应用程序,我需要将设备ID从C#类传递给C ++对象。 ID的格式为:

\\?\SWD#MMDEVAPI#{0.0.0.00000000}.{572cb138-dda1-4723-90d7-373f04b795fb}#{e6327cad-dcec-4949-ae8a-991e976a79d2}

如果我将其转换为:

,这在C ++中效果很好
L"\\\\?\\SWD#MMDEVAPI#{0.0.0.00000000}.{572cb138-dda1-4723-90d7-373f04b795fb}#{e6327cad-dcec-4949-ae8a-991e976a79d2}"

但是,如果我将它作为System.String从C#类传递给C ++并将其转换为LPCWSTR,它就不起作用。

C ++代码:

UniversalAudioPlayer::UniversalAudioPlayer(String^ deviceID)
{
HRESULT hr = XAudio2Create(&xAudio);

if (FAILED(hr))
    ref new COMException(hr, "XAudio2Create failure");

XAUDIO2_DEBUG_CONFIGURATION debugConfig = { 0 };
debugConfig.TraceMask = XAUDIO2_LOG_DETAIL | XAUDIO2_LOG_WARNINGS;
xAudio->SetDebugConfiguration(&debugConfig);

hr = xAudio->CreateMasteringVoice(&masteringVoice, 0U, 0U, 0U, (LPCWSTR)deviceID);

if (FAILED(hr))
    ref new COMException(hr, "Could not create mastdsdering voice");

xAudio->StartEngine();
}

C#代码:

UniversalAudioPlayer player = new UniversalAudioPlayer("\\\\?\\SWD#MMDEVAPI#{0.0.0.00000000}.{41a5b8e4-ad46-4bcb-b8a0-3621edafd176}#{e6327cad-dcec-4949-ae8a-991e976a79d2}");

我无法收录

#include < vcclr.h >

在我的C ++类中,因为WinRT不支持托管程序集。

请建议我任何解决方案。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用String :: Platform::String方法从Data ^转换为wchar_t *。

hr = xAudio->CreateMasteringVoice(&masteringVoice, 0U, 0U, 0U, deviceID->Data);