بدء تشغيل عارض الصور من Windows XP على Windows الحديث

لدي مجلد يحتوي على صور قديمة قمت بجمعها في صفر. أنا أنقل من جهاز كمبيوتر إلى آخر مع جميع ملفاتي مع كل ترقية ، وأحيانًا أذهب إلى الحنين. ولكن في كل مرة كنت أشعر بالحرج قليلاً من أن عارض 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.

Source: https://habr.com/ru/post/ar430434/


All Articles