我正在使用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 here和this article talks extensively about using BindToStorage()。我怀疑现在是检索文档源路径的方法,但我们非常感谢任何确认或指示。
最后一点:控制权实施IObjectSafety,并支持INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA
。
答案 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获取:
有趣的:IMonikerProp
(可能是您原始问题的答案),IDataObject
,IPersistFile
,IPersistMoniker
,IPersistStreamInit
,{{ 1}}。我实现了所有这些并看到了什么叫做。
我无法回答有关如何将自定义IPersistPropertyBag
typelib属性添加到RegAsm为C#项目生成的类型库的问题。我甚至不确定这对哑剧演员来说是一个严格的要求。如果你能找到它们,我有兴趣知道这两个答案。可能一种选择是在C ++中开发一个包装器ActiveX控件,它只是将所有内容转发给C#实现。