كيف يمكن للتطبيق 32 بت العثور على موقع دليل ملفات البرنامج 64 بت على Windows Vista 64-bit؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

أنا أعاني من مشكلة في كيفية تحديد موقع دليل ملفات البرنامج 64 بت على نظام التشغيل Windows Vista 64 بت من تطبيق 32 بت.

يدعو إلى SHGetKnownFolderPath(FOLDERID_ProgramFilesX64) لا تعيد أي شيء. ال MSDN مقالة - سلعة معروف ينص أيضًا على أن هذه الدعوة المعينة بها FOLDERID_ProgramFilesX64 غير مدعوم لتطبيق 32 بت.

أرغب في تجنب أكبر قدر ممكن من الترميز المتشددين إلى "C: Program Files". القيام بشيء مثل GetWindowsDirectory(), ، استخراج محرك الأقراص من قيمة الإرجاع وإضافة "ملفات البرنامج" إلى ذلك ليس جذابًا أيضًا.

كيف يمكن للتطبيق 32 بت الحصول على موقع المجلد بشكل صحيح من Windows Vista 64 بت؟

خلفية

يحتوي تطبيقنا على مكون خدمة من المفترض أن يقوم بتشغيل عمليات أخرى بناءً على طلبات من مكون خاص بمستخدم المستخدم. يمكن أن تكون التطبيقات التي تم إطلاقها 32 بت أو 64 بت. نحن نفعل هذا هو عبر CreateProcessAsUser() من خلال المرور في رمز من بدء عملية جلسة المستخدم. لدعوة إلى CreateProcessAsUser, ، نقوم بإنشاء كتلة بيئة عبر CreateEnvironmentBlock() API. المشكلة هي CreateEnvironmentBlock(), ، باستخدام الرمز المميز لتطبيق جلسة المستخدم ، يقوم بإنشاء كتلة مع برنامج 6432 = "C: Program Files (x86)" ، وهي مشكلة لتطبيقات 64 بت. نحن بحاجة إلى تجاوزها بالقيمة المناسبة.

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

المحلول

كما ذكرت ، لن يعمل استخدام ShgetminayFolderPath من تطبيق 32 بت على نظام تشغيل 64 بت. وذلك لأن مضاهاة WOW64 سارية.

ومع ذلك يمكنك استخدام ريجوبنيكس يمر في العلم KEY_WOW64_64KEY ثم اقرأ دليل ملفات البرنامج من التسجيل.

الموقع في السجل:

hkey_local_machine software microsoft windows currentVersion

أنت مهتم بقيمة السلسلة:

ProgramFilesDir

نصائح أخرى

إذا قرأت تلك الصفحة بعناية ، فسترى أن FolderId_ProgramFilesX64 مدعوم بتطبيق 32 بت على نظام التشغيل 64 بت. لا يتم دعمه على نظام التشغيل 32 بت ، وهو أمر منطقي تمامًا.

FOLDERID_PROGRAMFILESX64 مدعوم ...

يقول MSDN إنه مدعوم ، لكن وثيقة Microsoft "WOW64" أفضل الممارسات تقول إنها ليست كذلك. نرى http://download.microsoft.com/download/a/f/7/af777e5-7dcd-4800-8a0a-b18336565b/wow64_bestprac.docx

يقتبس:

• تعمل بعض المتغيرات فقط إذا كانت العملية 64 بت. على سبيل المثال ، لا يعمل FolderId_ProgramFilesX64 للمتصلين 32 بت. في إصدارات Windows في وقت مبكر من Windows 7 ، لم يعمل ProgramW6432 ٪ في سياق العمليات 32 بت. يجب أن يحدد التطبيق ما إذا كان يعمل في عملية 64 بت قبل استخدام هذه المتغيرات.

تحت Windows 7 X64 ، تشغيل تطبيق 32 بت في Visual Studio Debugger ، أحصل أيضًا على رمز إرجاع قدره 0x80070002 (ومؤشر فارغ). تشغيل نفس الرمز الذي تم تجميعه كـ 64 بت بإرجاع القيمة S_OK ويتم ملء المسار بشكل صحيح.

لقد استخدمت اختراق التسجيل على النحو المذكور أعلاه لأنه لا يمكنني العثور على أي حلول أخرى.

يمكنك أيضًا الاستعلام عن متغير البيئة ProgramW6432. من الواضح أنه موجود فقط في نوافذ 64 بت ، ولكن يجب أن يعيد دليل ملفات البرامج الحقيقي 64 بت ، ويبدو أنه يتم تعريفه للبرامج 64 بت و 32 بت. على الأقل عملت بالنسبة لي (C#، GetEnvironmentVariable)...

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