如何使用mime播放器Activex控件来检索文档的路径?

时间:2014-07-01 15:10:41

标签: c# com activex

我正在使用ActiveX控件,并且正在基于Mime类型正确实例化控件。我正在尝试了解如何检索文件的路径。

This very old (deprecated) KB article具体说:

  

在所有情况下,Internet Explorer都会传递要播放的文件的URL   通过IPropertyBag界面的默认播放器。那就是   Internet Explorer启动播放器,它会创建一个实例   IPropertyBag并使用文件的URL加载“SRC”属性   玩。然后它向玩家查询IPersistPropertyBag并发送它   IPropertyBag实例到IPersistPropertyBag::Load

我实现了这个,但是永远不会调用load方法。

    int IPersistPropertyBag.Load(IPropertyBag pIPropertyBag, object pErrorLog)
    {
        object var = null;
        pIPropertyBag.Read("SRC", out var, (IErrorLog)pErrorLog);
        return 0;
    }

IBindStatusCallback::OnDataAvailable事件中还有wealth of information herethis article talks extensively about using BindToStorage()。我怀疑现在是检索文档源路径的方法,但我们非常感谢任何确认或指示。

最后一点:控制权实施IObjectSafety,并支持INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA

1 个答案:

答案 0 :(得分:1)

我认为这可以通过公开Data Path Property

来完成
#define GUID_PathProperty 0002DE80-0000-0000-C000-000000000046

[id(1), bindable, displaybind, propput, 
    custom(GUID_PathProperty, "application/custom-mime-type")] 
    HRESULT put_Src(BSTR src);

或者,我相信如果您的ActiveX MIME播放器控件实现IPersistMoniker,那么您可以通过IMoniker::GetDisplayName获取网址:How To Find the URL of an ActiveX Document from Inside the Server

最后,可能存在通过Data URI方案嵌入数据并且URL不可用的情况。你的控制应该能够解决这个问题,例如:

<object src="data:application/custom-mime-type;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
    AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
    9TXL0Y4OHwAAAABJRU5ErkJggg==">
</object>

已更新,以下是Adobe PDF ActiveX控件(ProgID AcroPDF.PDF,CLSID {ca8a9780-280d-11cf-a24d-444553540000})的简单测试网页,这是一个已建立的PDF的Mime播放器。

<body>

<object
  classid="clsid:ca8a9780-280d-11cf-a24d-444553540000" id="pdf1" 
  type="application/pdf"
  data="test.pdf"
  style="width: 100%; height: 100%">

<param name="src" "value"="test.pdf"></param>

</object>

</body>

要使其与本地(file://)PDF文档一起使用,我必须同时指定data属性和src参数。当它从http://localhost提供时,data就足够了。

以下是它实现的COM / OLE接口列表,使用OleView获取:

AcroPDF.PDF Contol

有趣的:IMonikerProp(可能是您原始问题的答案),IDataObjectIPersistFileIPersistMonikerIPersistStreamInit,{{ 1}}。我实现了所有这些并看到了什么叫做。

我无法回答有关如何将自定义IPersistPropertyBag typelib属性添加到R​​egAsm为C#项目生成的类型库的问题。我甚至不确定这对哑剧演员来说是一个严格的要求。如果你能找到它们,我有兴趣知道这两个答案。可能一种选择是在C ++中开发一个包装器ActiveX控件,它只是将所有内容转发给C#实现。