قم بالسحب والإسقاط من C# إلى Windows Explorer باستخدام IStorage/IStream
-
16-09-2019 - |
سؤال
لقد كنت أعمل على ما يبدو وكأنه وظيفة بسيطة لفترة طويلة جدًا الآن.الفكرة هي أن لدي تطبيقًا به TreeView.تمثل طريقة عرض الشجرة هذه محتويات قاعدة بيانات منظمة في ملفات ومجلدات، تشبه إلى حد كبير مستكشف Windows.لذلك فمن المنطقي أن يكون المستخدم قادرًا على سحب هذه الملفات/المجلدات من تطبيقي إلى مستكشف Windows.
قررت أنني يجب أن أستخدم IStream
إذا قاموا بسحب ملف أو ملف IStorage
إذا قاموا بسحب مجلد.بعد وقت طويل جدًا وتعلم أكثر مما أردت معرفته عن Win32/COM (ودفعة من شخص مفيد جدًا هنا)، حصلت أخيرًا على ذلك IStream
أو IStorage
مخلوق.
ثم وجدت أن لتمرير هذا IStream
أو IStorage
قبالة إلى مستكشف Windows، كان علي أن أحصل عليه في ملف STGMEDIUM
.وبطبيعة الحال، فإن الوسيط.tymed سيكون إما IStream
أو IStorage
, ، اعتمادًا على ما أستخدمه، ولكن كما أفهمه medium.unionmember
يجب أن يكون مؤشرا إلى IStream/IStorage
.
لقد حاولت استخدام الكلمة الأساسية الثابتة (لكنها ليست قابلة للكسر بالطبع)، لقد حاولت فقط تحويل الشيء المدمر إلى مصفوفة بايت، لكن لم أتمكن من التوصل إلى طريقة لتحقيق ذلك، لقد حاولت باستخدام GCHandle لتثبيته (لكنه لا يزال غير قابل للكسر)، والعديد من الأشياء الأخرى التي لم تنجح.
لذا سؤالي هو هذا:منح IStorage s
و STGMEDIUM m
, ، كيف أقوم بالسكان m.unionmember
حتى يكون مستكشف Windows سعيدًا ويقبل الإسقاط؟
المحلول
عادة، يتم تمثيل النقابات C باستخدام StructLayout.Explicit
شركة#.ربما لن ينجح هذا في حالتك، بينما يمكنك التراكب IStream
و IStorage
مراجع من هذا القبيل، سيحاول المنظم تنظيم كليهما.من المحتمل أن يكون أفضل رهان هو الإعلان عن الحقل كـ IntPtr
في إعلانك عن STGMEDIUM
, ، واستخدام Marshal.GetIUnknownForObject
لتهيئته.
نصائح أخرى
أعتقد أن الموضوع قديم منذ فترة طويلة، ولكن أي شخص يبحث عن سحب وإفلات الملفات، راجع هذه المناقشة وخاصة مشاركة dbirdz: http://www.daniweb.com/forums/thread166429.html
في نظري، قد ينطبق هذا أيضًا على هذا التطبيق، وسأحاول كتابة الدفق الخاص بي في ملف مؤقت يمكن بعد ذلك نقله إلى موقعه.