كيفية العثور على ما إذا كان يمكن فتح مستند عبر shellolexecute؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

أريد أن تحقق ما إذا كان يمكن فتح ملف معين بنجاح "فتح" عبر SHELLEXECUTE، لذلك أحاول استخدام Assockeerystring لاكتشاف ذلك.

مثال:

DWORD size = 1024;
TCHAR buff[1024];  // fixed size as dirty hack for testing

int err = AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".mxf", NULL ,buff , &size);
openAction->Enabled  = ((err == S_OK) || (err == S_FALSE)) && (size > 0);

الآن، هذا تقريبيا يعمل. إذا كان هناك تطبيق مسجل، أحصل على السلسلة.

ولكن، هناك مصيد: على نظام التشغيل Vista، حتى لو لم يكن هناك طلب مسجل، فإنه يرجع أن التطبيق C: Windows System32 shell32.dll مرتبط، وهو الشيء الذي يطرح ما يصل إلى 100٪ لا يمكن فتح النوافذ "لا يمكن فتحها" هذا الملف: استخدم خدمة الويب للعثور على البرنامج الصحيح؟ "الحوار.

من الواضح أنني أريد إخفاء هذه الفئران من المستخدمين CR * P من المستخدمين النهائيين، ولكن ببساطة مقارنة السلسلة التي تم إرجاعها إلى ثابت تبدو وكأنها طريقة قبيحة وغشاشة وسيلة هشة للقيام بذلك.

أيضا، اختراق التسجيل لتعطيل هذا الحوار تماما ليس فكرة رائعة.

ما هو خيار أفضل؟

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

المحلول

أنا دائما استخدام FindExecutable() للحصول على الطلب المسجل وثيقة معينة.

نصائح أخرى

هناك طريقة أخرى للقيام بذلك، باستخدام ASSOCF_INIT_IGNOREUNKNOWN علم الخيار مع AssocQueryString().

int err = AssocQueryString(ASSOCF_INIT_IGNOREUNKNOWN, ASSOCSTR_EXECUTABLE, ".mxf", NULL ,buff , &size);

هذا لديه اثنين من المزايا المهمة حول استخدام FindExecutable()

  • يمكن أن تعمل مع امتداد الملف فقط، في حين FindExecutable يحتاج إلى مسار كامل إلى ملف موجود من النوع المحدد.
  • لأنه لا يصل إلى الملف، فإنه أسرع بكثير مع سامبا وتخزين الشبكة الأخرى. دعا FindExecutable() في ملف واحد في دليل يحتوي على ~ 3000 ملفات عبر Samba استغرق> ثانية واحدة في اختباراتي.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top