ما هي الطريقة الصحيحة لتنفيذ ملحق قذيفة معالج العقارات المدارة؟

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

سؤال

الآن أن .NET CLR 4.0 يدعم عملية جنبا إلى جنب (SXS) يجب أن تكون ممكنة الآن لكتابة Shell ملحقات في التعليمات البرمجية المدارة. لقد حاولت هذا ونحدث مشفرة معالج العقارات أن تنفذ IPROPERTYSTORE، IINITIALIZEWITHSTREAM و IPROPERTYSTORECATICATIATICATICATION.

المعالج يعمل بشكل جيد وتسمى كما هو متوقع عند تصفح الملفات عبر المستكشف. كما أنه يعمل بشكل جيد في عرض خصائص مخصصة في لوحة المعاينة وخصائص الملفات "التفاصيل".

ومع ذلك، عندما أحاول قم بتحرير خاصية في لوحة المعاينة، ثم انقر فوق "حفظ" أحصل على خطأ "ملف في استخدام" يقول ذلك الملف مفتوح في مستكشف Windows.

عدد قليل من الحكايات:

  1. عندما يدعو المستكشف iinitializeWithstream.initialize الخاصية STGM تعيين على STGM_SHARE_DENY_WRITE.
  2. وليس في أي وقت هل استدعاء المستكشف IPROPERTYSTORE.SETVALUE أو IPROPERTYSTORE.COMMIT.
  3. أرى مكالمات متكررة إلى معالجتي على مؤشرات ترابط مختلفة لنفس خصائص الملفات.
  4. إذن ماذا أحتاج إلى تغيير (أو تعيين في السجل) للحصول على مكان الإقامة حفظ للعمل؟

    تحديث:

    شكرا لك بن عملها. كان "الجزء الصعب" (على الأقل بالنسبة لي) هو فهم أن COM Interop لن تتصل بالتخلص أو الانتهاء من خاصي. كان هذا يترك الملفات التي معالجتها مفتوحة حتى ركض GC.

    لحسن الحظ، يعمل "بروتوكول معالج العقار" بحيث يتم استدعاء IINITializeWithReam.initialize () للحصول على قراءة () ل ReadValue. سيتم استدعاء في النهاية.

    giveacodicetagpre.

هل كانت مفيدة؟

المحلول

نعم، يجب عليك addref () الدفق للحفاظ عليه مفتوحا والحفاظ على المرجع على قيد الحياة بشكل صحيح.

لاحظ أن المفهرس سيستخدم معالج العقار لفتح الملف أيضا.لذلك إذا تسرب كائن الدفق، سيبقى الملف مفتوحا.يمكنك استخدام ProCEXP SYSINTERNALS لإخبار العملية التي تحتوي على الملف مفتوحا أو procmon لإخبار المكالمات والمعلمات التي استخدمتها.

نصائح أخرى

مستكشف يحاول التأكد من عدم التدخل في التطبيقات الأخرى التي قد تحتوي على الملف مفتوحا.هل يمكن استخدام الملف بشكل مشروع من قبل تطبيق آخر؟هل هناك معالج معاينة مفتوحة؟

في بعض الأحيان، نرى معالجات الممتلكات التي تحتفظ بتدفقاتها مفتوحة لفترة أطول من الضرورة (أو معالجات قائمة على الملفات التي تفتح الملف بأذونات تقييدية).يمكنك التحقق إذا كنت تقوم بإطلاق سراح الدفق في الوقت المناسب؟

أخيرا، لا أعتقد أن هذا يرتبط بمشكلتك الفورية، ولكن استخدام ملحقات Shell .NET غير مدعومة.نوصي بأن لا يتم دمج هذا في أي منتج.

-Ben

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