地铁样式应用 MFT "Class Not Registered"错误



我目前正在设计一款带有Metro应用程序框架的应用程序,该框架包括实时视频聊天功能。我使用的是MediaCapture示例中包含的GrayscaleTransform MFT(此时只需从示例中复制和粘贴)。

然而,当我试图将灰度效果添加到相机的图像流中时,我会遇到一个"类未注册"的致命错误。我知道这是因为我必须"激活并注册"媒体扩展,但我不知道如何如何注册媒体扩展

非常感谢所有的帮助,我总是接受答案!

更新:我的灰度IDL文件如下所示:

import "Windows.Media.idl";
#include <sdkddkver.h>
namespace GrayscaleTransform
{
[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]
runtimeclass GrayscaleEffect 
{
    [default] interface Windows.Media.IMediaExtension;
}
}

媒体扩展在包清单的扩展部分中被指定为<Extension>(或扩展点),但您需要手动插入它(即,以代码形式打开appxmanifest,而不是双击。)

使用GrayscaleTransform示例,在媒体扩展示例中,打开MediaExtensions项目的包.appxmanifest(作为代码),并在<Extensions>部分中查找:

<Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
        <Path>GrayscaleTransform.dll</Path>
        <ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" ThreadingModel="both" />
    </InProcessServer>
</Extension>

在应用程序合同和扩展中有更多关于扩展的一般信息。

正如Chris Bowen在回答中所解释的,您的应用程序的AppXManifest缺少媒体扩展模块中可激活类所需的扩展元素。所有(非Windows提供的)可激活类都需要在AppXManifest中列出。将Extension节点添加到AppXManifest的解决方案本身就可以工作,这就是MediaExtensions示例应用程序所做的。

但是,您通常不需要手动编辑扩展名列表。如果添加对Windows运行时组件项目、松散的WinMD文件或扩展SDK的引用,则构建应自动为引用组件中的每个可激活类生成extension元素。

没有发生这种情况的原因是,媒体扩展在IDL中没有用[activable]属性进行注释,因此它们在生成的WinMD中没有用ActivatableAttribute进行属性化。您可以在其IDL定义中将类型声明为可激活的,而不是手动编辑AppXManifest。

例如,要更新GeometricSource.GeometricSchemeHandler,可以将其在IDL中的定义从:更改为

[version(NTDDI_WIN8)]
runtimeclass GeometricSchemeHandler
{
}

至:

[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]
runtimeclass GeometricSchemeHandler
{
    [default] interface Windows.Media.IMediaExtension;
}

注意添加的activatable属性和添加的[default]接口。如果您对每个扩展进行这些更改并清理/重建,则不需要在AppXManifest中显式指定可激活类型:构建系统将自动添加它们。

相关内容

最新更新