كيف يمكنني إعادة توجيه جميع الاختصارات إلى قابلة للتنفيذ؟ هل هناك أي مكافئة للاشتعال على Windows؟

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

سؤال

أنا أعمل على برنامج يتضمن محركًا عامًا للأغراض ، وبعض المحتوى المحدد للبرنامج ، ومحديثات تلقائية مخصصة للتعامل مع تحديث العديد من الوسائط Gigabytes في المحتوى الخاص بنا قدر الإمكان. في إصدار حديث من المحرك ، قمنا بإعادة تنظيم بنية الدليل الخاصة بنا ، بحيث بدلاً من التثبيت القابل للتنفيذ (على سبيل المثال) c:\Program Files\Program\Engine.exe, ، هو الآن في c:\Program Files\Program\engine\win32\NewEngine.exe (لاحظ أن اسم المحرك قد تغير كذلك في هذه العملية).

تكمن المشكلة في أنه من أجل إطلاق البرنامج ، يحتاج المستخدم إلى استخدام اختصار ، والذي نقوم بتثبيته في قائمة البداية الخاصة بهم و (اختياريًا) على سطح المكتب. تحرك المحرك بعد تحديث تحديث تلك الاختصارات ، على الرغم من. لذا ، أحتاج الآن إلى معرفة طريقة لإصلاح جميع الاختصارات التي لدى المستخدم من أجل إطلاق البرنامج.

قادمًا من خلفية UNIX/MAC OS X ، سيكون ميلتي هو إنشاء ترابط من الاسم القابل للتنفيذ القديم إلى الاسم الجديد. على حد علمي ، لا يوجد حقًا ما يعادل ارتباطًا على Windows (من Googling ، أرى أن هناك موجودًا symlinks على Vista وبعد ذلك, ، ولكن هذا يحتاج إلى العمل على XP). هل أنا مخطئ في افتراضي؟ هل هناك أي مكافئ على Windows إلى ارتباط قابل للتنفيذ؟

بعض الحلول الأخرى الممكنة التي تتبادر إلى الذهن هي:

  1. إنشاء قابلة للتنفيذ صغيرة في الموقع القديم الذي يطلق الموقع الحقيقي في الموقع الجديد. هل هناك أي طريقة سريعة وسهلة لإنشاء قابلة للتنفيذ بسيطة ، قابلة للتنفيذ ، تطلق فقط برنامجًا آخر؟ مرة أخرى ، على UNIX ، سأقوم ببساطة بإنشاء برنامج نصي Shell ، لكن بقدر ما أعرف أنني لا أستطيع تسمية أ .bat ملف .exe وركضها ، لذلك يجب أن يكون هذا وسيلة لإنشاء بالفعل .exe.
  2. عند التحديث ، ابحث عن جميع الاختصارات التي تشير إلى القابل للتنفيذ وتحريرها. هل هناك أي طريقة (فعالة وموثوقة) للعثور على جميع الاختصارات على النظام التي تشير إلى موقع معين وتحديثها؟
  3. مزيج من ما سبق ، مع قابلة للتنفيذ صغير يكتشف أنه يتم إطلاقه من اختصار ، ويقوم بتحرير هذا الاختصار قبل إطلاق البرنامج الحقيقي. هل هناك أي طريقة لاكتشاف أنه يتم إطلاق البرنامج من اختصار ، وبالتالي يكون قادرًا على تحرير هذا الاختصار؟

هل سيعمل أي من هذه الخيارات ، وإذا كان الأمر كذلك ، فكيف؟ ما هي أفضل طريقة للقيام بهذا النوع من الأشياء على Windows؟ هل أفتقد أي طرق أخرى لإعادة توجيه اختصار من موقع إلى آخر؟

تحرير لإضافة: بعض المتطلبات الإضافية لدينا:

  1. العديد من مستخدمينا غير تقنيين. أي حل يتطلب تدخل المستخدم غير وارد.
  2. يجب أن يكون هذا سلسًا قدر الإمكان. وجود أي Windows إضافي يطفو على السطح في كل مرة ينقر فيها المستخدم على الاختصار غير مقبول.
  3. يجب أن يكون هذا قويًا في مواجهة معظم الأشياء التي كان يمكن للمستخدم القيام بها ، مثل إعادة ترتيب قائمة البدء أو نقل اختصار إلى شريط الإطلاق السريع.
  4. اختصاراتنا ضرورية للغاية لعمل البرنامج ، لأنها تمر في الحجج اللازمة للمحرك لتحميل المحتوى (نعم ، هذا أقل من المثالي ؛ أنا أفضل إصلاح هذا ، لكن في هذه المرحلة)
  5. أبحث عن شيء سريع نسبيًا وسهل التنفيذ وموثوق به للغاية.
هل كانت مفيدة؟

المحلول 3

حسنًا ، الحل الذي قررناه هو مجرد القيام بالقابل التنفيذ الصغير الذي يطلق محركنا الحقيقي. استغرق الأمر أكثر من ذلك قليلاً مع Visual Studio لإعداد المشروع مما كنت أفضل ، لكن يبدو أنه يعمل.

#include "stdafx.h"
#include <shellapi.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
  HINSTANCE result = ShellExecute(NULL, _T("open"), 
                                  _T("engine\\win32\\NewEngine.exe"),
                                  lpCmdLine, NULL, 1);
  // ... handle errors ...
  return 0;
}

تعديل: لا. يبدو أن هذا يعمل على XP ، ولكن ليس Windows 7 أو Vista. أي أفكار عن سبب فشل هذا في نظام التشغيل Windows 7 أو Vista سيكون موضع تقدير كبير. إذا لم أتمكن من معرفة ذلك قريبًا ، فقد أقوم بتقسيم هذا إلى سؤال منفصل.

تحرير 2: آه. على XP ، تعمل الملاط للأمام في اسم المسار على ما يرام. على Vista أو الأحدث ، تحتاج إلى خلفية.

نصائح أخرى

الغريب بما فيه الكفاية ، لم يذكر أحد NTFS الروابط الصلبة.

بعض المراجع:

لماذا لا يمكنك الكتابة فوق الاختصارات أثناء تثبيت التحديثات؟

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

(أعتقد أنه يمكنك أن تفترض بأمان أنه إذا قام المستخدم بإنشاء اختصار ثالث في موقع غير قياسي ، فهو يعرف ماذا يعني ذلك أو أين يبحث عن المعلومات عندما لا يعمل الاختصار المنسوخ. في مكان ما في التحديث مع الإشارة إلى التغييرات.)

إذا كنت تريد حقًا فعل ما ذكرته (تحديث كل اختصار) ، فيمكنك القيام بذلك بامتداد لطريقة الإجابة المقبولة هنا. مجرد بحث لأي ملف .lnk ، معرفة ما إذا كان TargetPath هو موقع المحرك القديم ، وقم بتحديثه إذا كان كذلك.

من وثائق MSDN لـ Shellexecute (), ، لاحظت أنك قد تحتاج إلى تهيئة COM. أيضًا ، تحتاج إلى توفير مسار كامل للقابل للتنفيذ (وليس النسبي). بدلاً من ذلك ، يمكنك استخدام متغيرات البيئة في الاختصارات بدلاً من المسارات الكاملة. يمكنك تعديل متغيرات البيئة خلال عمليات تثبيت جديدة لتعكس المسارات الجديدة.

هذا يبدو وكأنه مشكلة المثبت بالنسبة لي. أثناء الترقية ، لماذا لا تُوقف فقط الإصدار القديم وتثبيت الإصدار الجديد؟ لست على دراية بإعداد Inno ، ولكن هذه هي الطريقة التي نقوم بها بتثبيت InstallShield الخاص بنا للترقية. منحت هذا لا يتعامل مع الحالة عندما يقوم المستخدم بإنشاء اختصار يدويًا ؛ ومع ذلك ، يمكن للمستخدم إعادة إنشائها. بالنسبة للبحث والاستبدال البسيط ، لا أعتقد أن الأمر يستحق هذا الجهد.

بدلاً من ShellexeCute ، جرب المعادلات CreateProcess أو تفرخ. أود أن أراهن على CreateProcess.

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