有问题问如何使注册免费COM工作,这不是其中之一。我有一个DirectShow视频源过滤器( 860BB310-5D01-11d0-BD3B-00A0C911CE86),它是在.Net中实现的,使用的代码是Maxim编辑的代码:纯.Net DirectShow滤波器。
我需要让ffmpeg将我的.Net DirectShow过滤器识别为一个视频源,使用免费注册COM (并排/ sxs)。在.Net框架中内置了对COM组件服务器的支持,因此理论上只要清单正确,ffmpeg就应该检测过滤器。
下面是我当前清单文件相关部分的片段。
<!-- 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><!-- 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的过滤器的方法的显着缩短版本。
[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过滤器时能够找到它。
发布于 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+也没有。
https://stackoverflow.com/questions/32683895
复制相似问题