首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >免费注册(sxs) COM DirectShow过滤器

免费注册(sxs) COM DirectShow过滤器
EN

Stack Overflow用户
提问于 2015-09-20 20:20:46
回答 1查看 2.3K关注 0票数 2

有问题问如何使注册免费COM工作,这不是其中之一。我有一个DirectShow视频源过滤器( 860BB310-5D01-11d0-BD3B-00A0C911CE86),它是在.Net中实现的,使用的代码是Maxim编辑的代码:纯.Net DirectShow滤波器

我需要让ffmpeg将我的.Net DirectShow过滤器识别为一个视频源,使用免费注册COM (并排/ sxs)。在.Net框架中内置了对COM组件服务器的支持,因此理论上只要清单正确,ffmpeg就应该检测过滤器。

下面是我当前清单文件相关部分的片段。

代码语言:javascript
复制
<!-- FFMPEG MANIFEST -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity name="ffmpeg.exe" version="1.0.0.0" type="win32" processorArchitecture="*"/>
<dependency>
 <dependentAssembly asmv2:codebase="DShowVideoFilter.manifest">
  <assemblyIdentity name="DShowVideoFilter" version="1.0.0.0" publicKeyToken="26A05D7C90FBA3E8"/>
 </dependentAssembly>
</dependency>
</assembly>
代码语言:javascript
复制
<!-- DIRECTSHOW FILTER MANIFEST -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <assemblyIdentity name="DShowVideoFilter" version="1.0.0.0" publicKeyToken="26A05D7C90FBA3E8" />
   <clrClass
      clsid="{65722BE6-3449-4628-ABD3-74B6864F9739}"
      progid="DShowVideoFilter.VideoCaptureFilter"
      threadingModel="Both"
      runtimeVersion="v2.0.50727"/>
   <file name="DShowVideoFilter.dll">
   </file>
   <file name="DShowVideoFilter.tlb">
     <typelib
        tlbid="{B618E67B-64C8-48E9-9F94-F13214B76808}"
        version="1.0"
        helpdir=""
        flags="hasdiskimage"/>
   </file>
</assembly>

因此,我在运行ffmpeg时没有任何错误(就像您在出现明显错误的情况下那样)--而且我确信所有配置正确的东西(与传统的system加载有关),我认为(未经确认)的问题是,ffmpeg通过DirectShow的智能连接系统加载DShow过滤器,这需要注册过滤器和引脚。以下是一些我发现的关于过滤器需要如何注册的文档:

现在,在Maxim的DShow基类中,他会自动处理#2。下面是注册实现BaseFilter的过滤器的方法的显着缩短版本。

代码语言:javascript
复制
[ComRegisterFunction]
public static void RegisterFunction(Type _type)
{
    AMovieSetup _setup = (AMovieSetup)Attribute.GetCustomAttribute(_type, typeof(AMovieSetup));
    BaseFilter _filter = (BaseFilter)Activator.CreateInstance(_type);
    string _name = _filter.Name;
    DsGuid _category = new DsGuid(_setup.Category);
    IFilterMapper2 _mapper2 = (IFilterMapper2)new FilterMapper2();

    RegFilter2 _reg2 = new RegFilter2();
    _reg2.dwVersion = (int)_setup.Version;
    _reg2.dwMerit = _setup.FilterMerit;
    _reg2.rgPins = IntPtr.Zero;
    _reg2.cPins = 0;

    IntPtr _register = Marshal.AllocCoTaskMem(Marshal.SizeOf(_reg2));
    Marshal.StructureToPtr(_reg2, _register, true);

    hr = _mapper2.RegisterFilter(_type.GUID, _name, IntPtr.Zero, _category, _instance, _register);

    Marshal.FreeCoTaskMem(_register);
}

这是一种方法(特别是mapper2.RegisterFilter),它允许ffmpeg在传统上(用RegAsm)注册到注册表中时找到DShow过滤器,它为过滤器和引脚创建注册表键,如#2链接所述。

tldr;

因此,问题是,如何在清单文件中模拟RegisterFilter的函数或智能连接注册表项,以便在sxs上下文搜索DirectShow过滤器时能够找到它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-20 23:27:52

这几乎是关于如何让免费注册的COM工作的问题之一。

正如您正确地说的,让它在最基本的层次上工作并不是一个问题。但是,清单不生成SxS加载错误这一事实意味着它是一个有效的清单XML。要知道它在语义上是否正确,例如查找缺少的依赖项或名称、CLSID和/或版本中的类型,使用CLSIDFromProgID进行测试,然后是本地的CoCreateInstance,或者使用Type.GetTypeFromCLSID/Type.GetTypeFromProgID,然后是.NET中的Activator.CreateInstance

不幸的是,对于这种情况,免注册COM只适用于基本COM功能,例如典型类、接口代理/存根和类型库注册,只需少量OLE (参见miscStatus )。对于COM本身未使用的类别或子项,注册是必要的。

为什么?因为没有其他人跟随先导,甚至COM+也没有。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32683895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档