2014-07-01 27 views
2

我正在處理一個ActiveX控件,並且正在基於Mime類型正確實例化控件。我試圖瞭解如何檢索文件的路徑。MIME播放器Activex控件應該如何檢索文檔的路徑?

This very old (deprecated) KB article特別說:

在所有情況下的Internet Explorer傳遞文件的URL通過IPropertyBag接口發揮 默認播放器。也就是說,當Internet Explorer啓動播放器時,它會創建一個 IPropertyBag的實例,並將文件的URL加載到「SRC」屬性中,以 播放。然後它向玩家查詢IPersistPropertyBag,並通過IPersistPropertyBag::Load發送 IPropertyBag實例。

我實現了這一點,但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()。我懷疑這是現在要檢索文檔的源路徑的方式,但任何確認或指導都非常感謝。

最後一點注意:控件DOES實現IObjectSafety,並且支持INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA

回答

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控件(進程id AcroPDF.PDF,CLSID {ca8a9780-280d-11cf-a24d-444553540000}),這是一個既定的啞劇播放器一個簡單的測試網頁PDF。

<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 PARAM兩者。當它從http://localhost提供時,僅僅data就足夠了。

這裏是它實現了COM/OLE接口的列表,以OLEVIEW獲得:

AcroPDF.PDF Contol

有趣的:IMonikerProp(這可能是回答你原來的問題),IDataObjectIPersistFileIPersistMonikerIPersistStreamInitIPersistPropertyBag。我會實現所有這些,看看會被調用。

我無法回答如何將自定義的GUID_PathProperty typelib屬性添加到由RegAsm爲C#項目生成的類型庫的問題。我甚至不確定這是一個啞劇玩家的硬性要求。如果你能找到它們,我會很有興趣知道這兩個答案。可能的一種選擇是在C++中開發一個包裝器ActiveX控件,它將只將所有內容轉發給C#實現。

+0

首先,感謝您的回答。我嘗試過實現'IPersistMoniker',但是我從來沒有在構造函數以外的任何函數上獲得斷點。 [這是一個包含當前代碼的pastebin](http://pastebin.com/vWkTNUUL)。關於爲什麼IPersistMoniker :: Load()永遠不會觸發的任何建議?另外,我在該控件的CLSID的'Implemented Categories'註冊表項下添加了一個'{0DE86A51-2BAA-11CF-A229-00AA003D7352}'的密鑰。我不確定這是否有必要,[這個人也不是這樣](http://stackoverflow.com/q/2070999/656243)。雖然它看起來似乎沒有必要。 –

+0

另一個注意事項:我環視了一下,但不知道如何在c#中實現數據路徑屬性。感覺就像我需要做的不僅僅是添加一個公共屬性(即裝飾它在c#中可能不存在的屬性)。 –

+0

@LynnCrumbling,檢查我的更新。 – Noseratio

相關問題