如何注册WinRT自定义音频效果类?修复hresult_class_not_registered错误
解决WinRT自定义音频效果类未注册异常(80040154)
核心问题原因
你用「Custom Control (WinUI 3)」模板创建的类是针对UI控件的,默认继承UI控件接口,并未实现音频效果所需的WinRT接口,也没有配置音频效果的系统注册信息,导致系统无法识别该类为音频效果组件。
具体修复步骤
1. 修正IDL接口定义
将MyAudioEffect.idl中的UI控件继承改为音频效果接口,实现Windows.Media.Effects.IAudioEffect:
namespace MRE_ClassNotRegistered { [default_interface] runtimeclass MyAudioEffect : Windows.Media.Effects.IAudioEffect { MyAudioEffect(); } }
2. 实现音频效果接口方法
在MyAudioEffect.cpp中补全IAudioEffect的所有必需方法(需符合音频逻辑,不能留空实现):
#include "pch.h" #include "MyAudioEffect.h" #include "MyAudioEffect.g.cpp" namespace winrt::MRE_ClassNotRegistered::implementation { MyAudioEffect::MyAudioEffect() { // 初始化逻辑 } Windows::Media::Effects::AudioEffectState MyAudioEffect::State() { return Windows::Media::Effects::AudioEffectState::Off; } void MyAudioEffect::SetState(Windows::Media::Effects::AudioEffectState const& value) { // 处理状态切换逻辑(开启/关闭效果) } }
3. 在应用清单中声明音频效果扩展
打开Package.appxmanifest,添加音频效果的扩展声明,让系统识别你的组件:
<Package ...> <Applications> <Application ...> <!-- 其他现有内容 --> <Extensions> <Extension Category="windows.audioEffect"> <AudioEffect> <DeviceCapability Name="microphone" /> <DeviceCapability Name="speaker" /> <AudioEffectType>custom</AudioEffectType> <AudioEffectId>MRE_ClassNotRegistered.MyAudioEffect</AudioEffectId> </AudioEffect> </Extension> </Extensions> </Application> </Applications> </Package>
4. 调整项目结构(可选但推荐)
将音频效果组件移到单独的WinRT Component项目中,而非WinUI3应用项目内:
- 新建WinRT Component项目,迁移
MyAudioEffect的idl、h、cpp文件 - 在WinUI3主应用项目中引用该组件项目
- 确保组件被正确打包到应用包中
5. 验证类注册
- 打包应用:重新生成解决方案并部署,系统会自动注册WinRT类
- 未打包桌面应用:以管理员身份执行命令手动注册组件DLL:
regsvr32.exe "你的组件DLL路径"
关键注意事项
- 自定义音频效果必须实现
IAudioEffect接口,不能继承UI控件类 - 应用清单的
AudioEffectId必须和类全名完全一致 - 未打包桌面应用需手动注册组件,打包应用由系统自动处理
内容的提问来源于stack exchange,提问作者Tom Huntington
相关产品推荐
相关产品推荐

