[英]Drag and drop from C# to Windows Explorer with IStorage/IStream
我一直在研究聽起來像簡單功能的東西。 我的想法是我有一個帶有TreeView的應用程序。 此樹視圖表示組織到文件和文件夾中的數據庫的內容,非常類似於Windows資源管理器。 因此,用戶應該能夠將這些文件/文件夾拖出我的應用程序並進入Windows資源管理器。
我決定如果他們拖動文件夾拖動文件或IStorage
,我應該使用IStream
。 經過很長一段時間和學習方式比我想知道的Win32 / COM(以及來自一個非常有幫助的人的推動),我終於創建了IStream
或IStorage
。
然后我發現要將此IStream
或IStorage
傳遞給Windows資源管理器,我必須在STGMEDIUM
獲取它。 當然,medium.tymed將是IStream
或IStorage
,取決於我正在使用的,但據我所知, medium.unionmember
必須是指向IStream/IStorage
的指針。
我嘗試過使用fixed關鍵字(但當然不是blittable),我試過將爆破的東西轉換為字節數組,但是無法想出辦法讓這種情況發生,我試過了使用GCHandle來固定它(但它仍然不是blittable),以及其他一些不起作用的東西。
所以我的問題是:鑒於IStorage s
和STGMEDIUM m
,如何填充m.unionmember
以便Windows資源管理器很高興接受丟棄?
通常,C聯合使用C#中的StructLayout.Explicit
表示。 然而,這可能不適用於你的情況 - 雖然你可以疊加IStream
和IStorage
引用,但是編組人員會嘗試編組兩者。 你最好的選擇可能是在你的STGMEDIUM
聲明中將該字段聲明為IntPtr
,並使用Marshal.GetIUnknownForObject
來初始化它。
我認為這個主題已經過時了,但是任何尋找文件拖放的人都會查看這個討論,特別是dbirdz的帖子: http ://www.daniweb.com/forums/thread166429.html
在我看來,這甚至適用於這個應用程序,我會嘗試將我的流寫入臨時文件,然后可以將其移動到其位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.