Metro Style App MFT“Class Not Registered”错误

时间:2012-07-30 21:19:55

标签: windows-8 windows-runtime ms-media-foundation

我目前正在使用Metro应用程序框架设计一个应用程序,其中包含实时视频聊天功能。我正在使用MediaCapture样本中包含的GrayscaleTransform MFT(此时只需从样本中复制粘贴)。

然而,当我尝试将灰度效果添加到相机的图像流时,我得到一个“类未注册”的致命错误。我理解这是因为我必须“激活并注册”媒体扩展,但我不知道如何。 如何注册媒体扩展程序?

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

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

import "Windows.Media.idl";

#include <sdkddkver.h>

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

2 个答案:

答案 0 :(得分:2)

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

使用GrayscaleTransform示例,在Media extensions sample中,打开MediaExtensions项目的package.appxmanifest(作为代码),并在<Extensions>部分中查找:

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

App contracts and extensions中有关于扩展程序的更多常规信息。

答案 1 :(得分:0)

正如Chris Bowen在his answer中解释的那样,您的应用程序的AppXManifest缺少媒体扩展模块中可激活类所需的Extension元素。所有(非Windows提供的)可激活类都需要在AppXManifest中列出。将Extension节点添加到AppXManifest的解决方案将起作用,这就是MediaExtensions示例应用程序似乎已经完成的工作。

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

没有发生这种情况的原因是媒体扩展没有使用IDL中的[activatable]属性进行注释,因此它们不会被生成的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中明确指定可激活类型:构建系统将自动添加它们。