2012-07-30 2 views
1

현재 라이브 비디오 채팅 기능이 포함 된 Metro 앱 프레임 워크로 앱을 디자인하고 있습니다. MediaCapture 샘플에 포함 된 GrayscaleTransform MFT를 사용하고 있습니다 (이 시점에서 샘플에서 복사하여 붙여 넣기 만 함).메트로 스타일 앱 MFT "클래스가 등록되지 않았습니다"오류

그러나 그레이 스케일 효과를 카메라의 이미지 스트림에 추가하려고하면 "클래스가 등록되지 않았습니다"치명적인 오류가 발생합니다. 내가 미디어 확장을 '활성화하고 등록'해야하기 때문에 이것이 무엇인지는 모르겠지만 어떻게해야할지 모르겠다. 미디어 확장은 어떻게 등록합니까?

모든 도움을 주시면 감사하겠습니다. 항상 답변을드립니다.

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> (또는 확장 점)로 지정되어 있지만 수동으로 삽입해야합니다 (예 : . 코드로합니다 (MediaExtensions 프로젝트의 package.appxmanifest를 열고 Media extensions sample에서 GrayscaleTransform 예제를 사용하여)

을 코드 대신 더블 클릭과 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에 기인하지 않는 것입니다. 이것은 약간 특이하다. –

+0

이 솔루션이 작동하는 동안 작동 시키려면 manifest 파일을 직접 편집해야합니다. 나는 그때까지 더 나은 해결책을 찾지 못했다면 내일이 대답을 받아 들일 것입니다. – danielmhanover

+0

동일한 작업을 수행하려고하지만 추가 DLL (GrayscaleTransform.dll)을 갖고 싶지 않습니다. 그래서, 그 dll 프로젝트에서 내 dll에 모든 파일을 복사하지만, 그것은 작동하지 않습니다. 내가해야 할 일이 있니? – Pavel

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

+0

GrayscaleTransform 프로젝트는 빌드의 일부로 .winmd 파일을 생성합니다. 응용 프로그램에서 프로젝트를 참조하면 해당 WinMD 파일도 배포 할 때 응용 프로그램과 함께 패키지되어야합니다. –

+0

나는 본다. 그러나 솔루션이 구축 될 때 확장이 매니페스트에 추가되지 않는 이유는 무엇입니까? – danielmhanover

관련 문제