Windows 8 地铁风格应用程序MFT“;“未注册的类别”;错误

Windows 8 地铁风格应用程序MFT“;“未注册的类别”;错误,windows-8,windows-runtime,ms-media-foundation,Windows 8,Windows Runtime,Ms Media Foundation,我目前正在使用Metro应用程序框架设计一个应用程序,其中包括一个实时视频聊天功能。我使用的是MediaCapture示例中包含的GrayscaleTransform MFT(此时只需从示例中复制和粘贴) 然而,当我尝试将灰度效果添加到相机的图像流时,我得到了一个“未注册的类”致命错误。我理解这是因为我必须“激活并注册”媒体扩展,但我不知道如何操作如何注册媒体分机? 非常感谢您的帮助,我始终接受您的回答 更新:我的灰度IDL文件如下所示: import "Windows.Media.idl";

我目前正在使用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;
}
}
导入“Windows.Media.idl”;
#包括
命名空间灰度转换
{
[版本(NTDDI_WIN8),可激活(NTDDI_WIN8)]
runtimeclass灰度效果
{
[默认]界面Windows.Media.imedia扩展;
}
}

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

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

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

GrayscaleTransform.dll

.

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

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

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

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

[version(NTDDI_WIN8)]
runtimeclass GeometricSchemeHandler
{
}
致:


注意添加的
activatable
属性和添加的
[默认]
界面。如果对每个扩展和清理/重建进行了这些更改,则不需要在AppXManifest中明确指定可激活类型:生成系统将自动添加这些类型。

通常不需要手动编辑扩展:如果您引用了项目或扩展SDK,构建将为引用的项目或扩展SDK中的每个可激活类自动添加扩展元素。这里的问题似乎是MediaExtensions类在IDL中没有用[activatable]注释,因此它们在各自的WinMDs中没有用activatable属性进行属性化。这有点奇怪。虽然此解决方案确实有效,但我需要直接编辑清单文件以使其正常工作,这似乎有些奇怪。如果明天我还没有找到更好的解决方案,我会接受这个答案。我正在尝试做同样的任务,但是,我不想有那个额外的DLL(GrayscaleTransform.DLL)。因此,我将该dll项目中的所有文件复制到我的主dll中,但它不起作用。有什么我需要做的吗?我已经尝试了上面的方法,但是我仍然得到“类未注册”错误,即使在清理和重建解决方案之后。我用IDL文件更新了我的问题。我不知道它是否相关,但我也没有WinMD文件。GrayscaleTransform项目生成一个.WinMD文件作为其构建的一部分。如果您引用应用程序中的项目,那么在部署应用程序时,该WinMD文件也应该与应用程序打包在一起。我明白了。但是为什么在生成解决方案时不将扩展添加到清单中呢?请注意,生成不会修改项目中的Package.AppXManifest文件。它只修改生成的AppXManifest.xml,它是在部署应用程序时创建的(通常位于解决方案的Debug\ProjectName\AppX文件夹下)。如果该类型不在该文件中,请在ildasm中打开WinMD for GreyscaleTransform:GrayscaleEffect类型是否具有ActivatableAttribute属性?@JamesMcNellis如果GrayscaleTransform中的代码复制到我的主本机dll(应该使用GrayscaleTransform的东西),该怎么办?只要GrayscaleTransform是一个独立的dll,它就适合我
[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]
runtimeclass GeometricSchemeHandler
{
    [default] interface Windows.Media.IMediaExtension;
}