قم بالسحب والإسقاط من C# إلى Windows Explorer باستخدام IStorage/IStream

StackOverflow https://stackoverflow.com/questions/1280240

سؤال

لقد كنت أعمل على ما يبدو وكأنه وظيفة بسيطة لفترة طويلة جدًا الآن.الفكرة هي أن لدي تطبيقًا به 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

في نظري، قد ينطبق هذا أيضًا على هذا التطبيق، وسأحاول كتابة الدفق الخاص بي في ملف مؤقت يمكن بعد ذلك نقله إلى موقعه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top