لدي مجلد يحتوي على صور قديمة قمت بجمعها في صفر. أنا أنقل من جهاز كمبيوتر إلى آخر مع جميع ملفاتي مع كل ترقية ، وأحيانًا أذهب إلى الحنين. ولكن في كل مرة كنت أشعر بالحرج قليلاً من أن عارض Windows 7 القياسي لم يعرض رسوم GIF المتحركة ، على الرغم من أن ذاكرتي أخبرتني أنه في أوقات XP ظهرت الرسوم المتحركة دون مشاكل. مع الهجوم التالي على الحنين ، ما زلت قررت تشغيل المشاهد من XP على Windows 7. بعد التغلب على عدد من العقبات ، أنا متأكد الآن من أن الرسوم المتحركة بتنسيق GIF كانت مدعومة حقًا هناك! والأهم من ذلك - يمكنني الآن مشاهدة مجلدي القديم بالصور في الواجهة الأصلية لعارض الصور Windows XP ، مما يخلق أجواء أكثر ملاءمة =)
تنزيل: shimgvw_xp32.7z (يتضمن الشفرة الثنائية ومصدر المشغل ، بالإضافة إلى shimgvw.dll من Windows XP SP3 باللغة الإنجليزية).
كيف تم ذلك؟
عارض الصور القياسي في نظام التشغيل Windows XP ليس تطبيقًا عاديًا. يقع في مكتبة shimgvw.dll ، ولا يمكنك تشغيله مباشرة - تحتاج على الأقل إلى
rundll32 (مطلوب مسار ملف صورة موجود):
rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif
ولكن هذه الحيلة لا تعمل عند محاولة تشغيل shimgvw.dll من Windows XP على Windows 7 والإصدارات الأحدث - لا يمكن تحميل shimgvw.dll ، فهو يحتاج إلى وضع التوافق مع Windows XP ليعمل بشكل صحيح. يمكن تحقيق ذلك عن طريق تعيين وضع التوافق المناسب لنسخة rundll32 ، ولكن التوافق مع XP يعني رفع أذونات التطبيق إلى الحد الأقصى ، مما يتسبب في ظهور مربع حوار UAC في كل بداية ، والتي أود تجنبها.
جعلت رقصة صغيرة مع المصحح من الممكن معرفة السبب - أثناء عملية التمهيد ، يحاول shimgvw.dll لاحقًا استيراد العديد من الوظائف من shunimpl.dll ، حيث يتم تخزين وظائف shell القديمة ، ويرفض الأخير التحميل افتراضيًا إذا كانت ATOM "FailObsoleteShellAPIs" غائبة (يسمح وجود هذه ATOM بتحميل المكتبة ، ولكن بعد ذلك تقوم جميع الوظائف القديمة بإرجاع رمز الخطأ). يقوم وضع التوافق مع XP ، من بين أمور أخرى ، بتعيين هذا ATOM ، بحيث يبدأ المشاهد في العمل.
تقرر كتابة محمل صغير يضيف ATOM "FailObsoleteShellAPIs" ، ويسأل عن الصورة التي سيتم فتحها (إذا لم يتم تحديد المسار في المعلمات) ، ثم ينقل التحكم إلى shimgvw.dll. يعمل العارض بشكل جيد (أي تم إكمال المهمة الأولية) ، لذلك لم أتحقق من الوظائف القديمة التي تم استيرادها من shunimpl.dll وفي أي الحالات يتم استخدامها - على ما يبدو ، لا يفعلون شيئًا مهمًا حتى يعمل المشاهد.
نظرًا لأنه لتنفيذ برنامج التحميل ، لا تحتاج إلى أي شيء بخلاف عدد صغير من وظائف WinAPI ، فقد قررت كتجربة بناء مشروع باستخدام Clang دون استخدام وقت التشغيل (سبق لي دائمًا استخدام MSVC لمثل هذه الرقصات). وهكذا ، تم الحصول على ملف قابل للتنفيذ بحجم 14 كيلوبايت ، ذهب منها 9 كيلوبايت إلى الرمز. إذا كان هناك شخص ما يحب أيضًا إنشاء الأدوات دون الاعتماد على المكتبات غير القياسية ، فيمكن أن يعمل هذا المشروع كمثال صغير على كيفية القيام بذلك باستخدام Clang.