在Delphi XE2中调用"IAudioSessionManager2.GetSessionEnumerator()"的异常

Eri*_*ier 3 delphi core-audio windows-7 delphi-xe2

以下代码在Delphi XE2 Win32下编译并在Win 7 64位下运行,在执行"AudioSessionManager2.GetSessionEnumerator"行时会产生以下异常:

"Project22.exe引发异常类$ C0000005,消息'访问冲突位于0x7027edb2:写入地址0x0051ced6'"

我对异常类或它们的含义的了解是缺乏的,所以我不知道异常意味着什么或如何修复它.

以下是引发异常的代码(用于调试代码的断言):

var
  HRES: HRESULT;
  DeviceEnumerator: IMMDeviceEnumerator;
  DefaultDevice: IMMDevice;
  AudioSessionManager2: IAudioSessionManager2;
  Enumerator: IAudioSessionEnumerator;
begin

  CoInitialize( nil );

  HRES := CoCreateInstance( CLSID_MMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, DeviceEnumerator );
  Assert( Succeeded( HRES ) );

  HRES := DeviceEnumerator.GetDefaultAudioEndpoint( eRender, eMultimedia, DefaultDevice );
  Assert( Succeeded( HRES ) );

  HRES := DefaultDevice.Activate( IID_IAudioSessionManager2, CLSCTX_ALL, nil, IUnknown( AudioSessionManager2 ) );
  Assert( Succeeded( HRES ) );

  HRES := AudioSessionManager2.GetSessionEnumerator( Enumerator );  // <- EXCEPTION HERE
  Assert( Succeeded( HRES ) );

  [snip]
Run Code Online (Sandbox Code Playgroud)

我正在使用Google Code上的MFPack 的Core Audio定义,IAudioSessionManager2和IAudioSessionEnumerator接口如下所示:

IAudioSessionManager2 = interface(IUnknown)
['{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}']
  function GetSessionEnumerator(out SessionEnum: IAudioSessionEnumerator): HResult; stdcall;
  function RegisterSessionNotification(SessionNotification: IAudioSessionNotification): HResult; stdcall;
  function UnregisterSessionNotification(SessionNotification: IAudioSessionNotification): HResult; stdcall;
  function RegisterDuckNotification(const sessionID: LPCWSTR; const duckNotification: IAudioVolumeDuckNotification): HResult; stdcall;
  function UnregisterDuckNotification(const duckNotification: IAudioVolumeDuckNotification): HResult; stdcall;
end;

IAudioSessionEnumerator = interface(IUnknown)
['{E2F5BB11-0570-40CA-ACDD-3AA01277DEE8}']
  function GetCount(out SessionCount: integer): HResult; stdcall;
  function GetSession(const SessionCount: integer; out Session: IAudioSessionControl): HResult; stdcall;
end;
Run Code Online (Sandbox Code Playgroud)

我相信接口已正确定义,我还仔细检查了GUID.

由于相同的指令序列在Visual Studio 2012(Win32项目)下按预期执行,我怀疑问题出在我的代码(这里很少有疑问),Core Audio接口定义或Delphi.在VS中运行的C++代码如下:

IMMDeviceEnumerator *DeviceEnumerator = NULL;
IMMDevice* DefaultDevice = NULL;
IAudioSessionManager2* AudioSessionManager = NULL;
IAudioSessionEnumerator* Enumerator = NULL;
HRESULT HR;

HR = CoCreateInstance( __uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&DeviceEnumerator );
HR = DeviceEnumerator->GetDefaultAudioEndpoint( eRender, eMultimedia, &DefaultDevice );
HR = DefaultDevice->Activate( __uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL,(void**)&AudioSessionManager );
HR = AudioSessionManager->GetSessionEnumerator( &Enumerator );
Run Code Online (Sandbox Code Playgroud)

使用C++代码,我可以正确检索会话枚举器并使用GetCount等.

我花了无数个小时试图找出我的代码有什么问题,我仍然无能为力,所以任何帮助都会非常感激.

Ond*_*lle 6

根据MSDN,IAudioSessionManager2应该继承自IAudioSessionManager:

type
  IAudioSessionManager2 = interface(IAudioSessionManager)
  ...
Run Code Online (Sandbox Code Playgroud)