2012-07-30 98 views
1

我目前正在設計一個包含實時視頻聊天功能的Metro應用程序框架應用程序。我正在使用MediaCapture樣本中包含的灰度轉換MFT(此時只需從樣本中複製並粘貼)。Metro Style App MFT「Class Not Registered」錯誤

但是,當我嘗試將灰度效果添加到相機的圖像流時,出現「未註冊類」致命錯誤。我理解這是因爲我必須「激活並註冊」媒體擴展,但我不知道如何。 如何註冊媒體擴展?

所有幫助非常感謝,我始終接受答案!

UPDATE:我的灰階IDL文件如下所示:

import "Windows.Media.idl"; 

#include <sdkddkver.h> 

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

回答

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有更多關於擴展的一般信息。

+0

通常不需要手動編輯擴展:如果您有對項目或擴展SDK的引用,構建會自動爲引用的項目或擴展SDK中的每個可激活類添加擴展元素。這裏的問題似乎是MediaExtensions類沒有在IDL中使用[activatable]進行註釋,所以它們在各自的WinMD中不會被賦予ActivatableAttribute。這有點奇怪。 – 2012-07-31 01:19:51

+0

儘管這個解決方案能夠工作,但我似乎很奇怪,我需要直接編輯清單文件才能使其工作。如果到那時我還沒有找到更好的解決方案,我明天就會接受這個答案。 – danielmhanover 2012-07-31 14:52:10

+0

我正在嘗試執行相同的任務,但是,我不想擁有額外的DLL(GrayscaleTransform.dll)。所以,我將該dll項目的所有文件複製到我的主dll,但它不起作用。有什麼我需要做的嗎? – Pavel 2013-10-03 15:41:16

0

正如Chris Bowen在his answer中解釋的,您的應用程序的AppXManifest缺少媒體擴展模塊中可激活類所需的擴展元素。所有(非Windows提供的)可激活類都需要在AppXManifest中列出。將擴展節點添加到AppXManifest的解決方案將自行工作,這就是MediaExtensions示例應用程序似乎完成的工作。

但是,您通常不需要手動編輯擴展名列表。如果添加對Windows運行時組件項目,寬鬆的WinMD文件或擴展SDK的引用,則構建應自動爲引用組件中的每個可激活類生成擴展元素。

這種情況不會發生的原因是媒體擴展沒有使用IDL中的[activatable]屬性進行註釋,因此它們不會被生成的WinMD中的ActivatableAttribute所歸屬。不用手動編輯AppXManifest,你可以在IDL定義中聲明該類型爲可激活的。

例如,要更新GeometricSource.GeometricSchemeHandler,您可以在IDL從改變它的定義:

[version(NTDDI_WIN8)] 
runtimeclass GeometricSchemeHandler 
{ 
} 

到:

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

注意添加activatable屬性和附加[default]接口。如果您對每個擴展和清理/重建進行了這些更改,則不需要在AppXManifest中明確指定可激活類型:構建系統將自動添加它們。

+0

我已經嘗試了上述方法,但即使在清理並重新構建解決方案後,我仍然得到「班級未註冊」錯誤。我用我的IDL文件更新了我的問題。我不知道它是否相關,但我也沒有WinMD文件。 – danielmhanover 2012-07-31 14:42:11

+0

GrayscaleTransform項目生成一個.winmd文件作爲其構建的一部分。如果您從應用程序中引用該項目,則在部署該應用程序時,該WinMD文件也應該與您的應用程序一起打包。 – 2012-07-31 17:03:17

+0

我明白了。但是,爲什麼解決方案建立時不將擴展添加到清單? – danielmhanover 2012-07-31 17:20:08

相關問題