异常调用";IAudioSessionManager2.getSessionNumerator();在Delphi XE2中

异常调用";IAudioSessionManager2.getSessionNumerator();在Delphi XE2中,delphi,windows-7,delphi-xe2,core-audio,Delphi,Windows 7,Delphi Xe2,Core Audio,下面的代码在Delphi XE2 Win32下编译并在Win 7 64位下运行,在执行“AudioSessionManager2.GetSessionNumerator”行时产生以下异常: “Project22.exe引发异常类$C0000005,并显示消息‘0x7027edb2处的访问冲突:写入地址0x0051ced6’” 我对异常类或它们的含义缺乏了解,因此我不知道异常意味着什么,也不知道如何着手修复它 以下是引发异常的代码(用于调试代码的断言): 我相信接口已经正确定义,我也仔细检查了gu

下面的代码在Delphi XE2 Win32下编译并在Win 7 64位下运行,在执行“AudioSessionManager2.GetSessionNumerator”行时产生以下异常:

“Project22.exe引发异常类$C0000005,并显示消息‘0x7027edb2处的访问冲突:写入地址0x0051ced6’”

我对异常类或它们的含义缺乏了解,因此我不知道异常意味着什么,也不知道如何着手修复它

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

我相信接口已经正确定义,我也仔细检查了guid

由于执行的指令序列与Visual Studio 2012(Win32项目)下预期的相同,我怀疑问题出在我的代码(这里毫无疑问)、核心音频接口定义或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 );

用C++代码,可以正确检索会话枚举器,使用GETCOUNT等。 我花了无数个小时试图找出我的代码出了什么问题,但我仍然一无所知,因此非常感谢您的帮助。

根据MSDN,应该继承自:


您不应该将
DefaultDevice.Activate()
的最后一个参数类型强制转换为
IUnknown
,将其保留为原始类型,就像使用
CoCreateInstance()
一样。你也应该使用
ocheck()
而不是
Assert()
。谢谢你的建议,雷米。Activate()被声明为将IUnknown作为其最后一个参数,这就是我将其转换为IUnknown的原因。我曾尝试将声明更改为各种其他类型,包括“out-ppInterface”,但没有任何效果。我只是尝试了C++的Builder中的C++代码,它也能像预期的那样工作。我花了好几天的时间做这件事,但我无法让它工作。我想在C++中做一个DLL可能会更容易,因为我负担不起更多的时间。最后一个参数应该是一个未键入的代码<代码> />代码>,就像<代码> COCCREATIN()/<代码>使用。另一种选择是<代码> PPointer <代码>,使用<代码> @ /Cuth>运算符传递变量,就像C++一样。根据您链接的MSDN页面,
IAudioSessionManager2
基于
IAudioSessionManager
,而
IAudioSessionManager
来自
IUnknown
。这非常有效!我将检查这些疏忽的接口的其余部分,并希望能够与维护它们的人员联系。
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;
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 );
type
  IAudioSessionManager2 = interface(IAudioSessionManager)
  ...