2009-08-14 33 views
5

Tôi đã làm việc trên những gì có vẻ như chức năng đơn giản quá lâu. Ý tưởng là tôi có một ứng dụng với TreeView. Cây treeview này đại diện cho nội dung của một cơ sở dữ liệu được sắp xếp thành các tệp và thư mục, giống như Windows Explorer. Vì vậy, nó có ý nghĩa rằng người dùng sẽ có thể kéo những tập tin/thư mục ra khỏi ứng dụng của tôi và vào Windows Explorer.Kéo và thả từ C# vào Windows Explorer với IStorage/IStream

Tôi quyết định rằng tôi nên sử dụng IStream nếu họ kéo tệp hoặc IStorage nếu họ kéo một thư mục. Sau một thời gian rất dài và học hỏi nhiều hơn bao giờ tôi muốn biết về Win32/COM (và một cú hích từ một người rất hữu ích ở đây), cuối cùng tôi đã tạo ra IStream hoặc IStorage.

Sau đó, tôi thấy rằng để vượt qua điều này IStream hoặc IStorage tắt đến Windows Explorer, tôi đã nhận được nó trong một STGMEDIUM. Tất nhiên, medium.tymed sẽ là IStream hoặc IStorage, tùy thuộc vào việc tôi đang sử dụng, nhưng khi tôi hiểu nó, medium.unionmember phải là một con trỏ đến số IStream/IStorage.

Tôi đã thử sử dụng từ khóa cố định (nhưng không phải blittable, dĩ nhiên), tôi đã thử chỉ chuyển đổi điều đã thổi thành mảng byte, nhưng không thể tìm ra cách để thực hiện điều đó, Tôi đã thử sử dụng GCHandle để ghim nó (nhưng nó vẫn không phải là blittable), và một số những thứ khác mà không hoạt động. Vì vậy, câu hỏi của tôi là: Given IStorage sSTGMEDIUM m, làm thế nào để tôi điền m.unionmember để Windows Explorer sẽ được hạnh phúc và chấp nhận thả?

+0

nếu có ai biết về việc triển khai IStream/IStorage hoàn chỉnh cho URL http, vui lòng đăng câu trả lời khác tại đây, có rất ít kết quả về google cho vấn đề này. –

+0

http://stackoverflow.com/questions/3168145/download-a-file-using-windows-istream –

Trả lời

2

Thông thường, các công đoàn C được thể hiện bằng cách sử dụng StructLayout.Explicit trong C#. Điều này có thể sẽ không hoạt động trong trường hợp của bạn, tuy nhiên - trong khi bạn có thể che phủ các tham chiếu IStreamIStorage như vậy, trình gỡ lỗi sẽ cố gắng sắp xếp cả hai. Đặt cược tốt nhất của bạn có thể chỉ cần khai báo trường là IntPtr trong tuyên bố của bạn là STGMEDIUM và sử dụng Marshal.GetIUnknownForObject để khởi tạo.

+0

Cảm ơn! Tôi không biết làm thế nào tôi bỏ lỡ GetIUnknownForObject ... Tôi nghĩ rằng tôi sẽ phải phá vỡ và thực sự tìm ra những gì Marshaling là một ngày ... –

0

Tôi nghĩ chủ đề này là lỗi thời bởi từ lâu, tuy nhiên bất cứ ai tìm kiếm một tập tin kéo và thả kiểm tra cuộc thảo luận này và đặc biệt là bài của dbirdz: http://www.daniweb.com/forums/thread166429.html

Trong mắt tôi này thậm chí sẽ áp dụng đối với ứng dụng này, tôi 'd cố gắng viết luồng của tôi vào một tệp tạm thời mà sau đó có thể được di chuyển đến vị trí của nó.

Các vấn đề liên quan