سؤال

تم رفع العملية وأقلت أن المسار كان صحيحا في Debugger VS (أنا أستخدم البيئة. GetFolderderPath (Environment.Specialfolder.System) ليس من الصعب الترميز عليه) ولكن الملف. لا يزال يستخدم الأخصائي كاذبة.

السبب في أنني أحتاج إلى أن هذا هو الحل البديل لضمان تثبيت بعض برامج تشغيل الطرف الثالث لأن إعدادات التسجيل الخاصة بها لا تتم إزالتها على إلغاء التثبيت.

أعرف أن يكتب إعادة توجيه عن طريق الافتراضية ولكن هذا صحيح أيضا لفحص وجود ملف؟

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

المحلول

نعم، يحدث الافتراضية على مستوى منخفض للغاية. تستدعي الطريقة الإضافية التي تستدعي الأساس الأساسي وينقصها ويكتشف الأخطاء. يتم توجيه CreateFile بواسطة النظام الفرعي WOW.

يمكنك تعطيل الافتراضية مؤقتا قبل الاتصال.

[DllImport( "kernel32", CharSet=CharSet.Unicode, SetLastError=true )]
public static extern bool Wow64DisableWow64FsRedirection( ref IntPtr oldValue );

[DllImport( "kernel32", CharSet=CharSet.Unicode, SetLastError=true )]
public static extern bool Wow64RevertWow64FsRedirection( IntPtr oldValue );

بطبيعة الحال لتكون كاملة عليك التحقق من وجود ملف مع الافتراضية أيضا. الأمر نفسه ينطبق على التحقق من إدخالات التسجيل أيضا.

public static bool FileExists( string path )
{
    if( File.Exists( path ) ) return true;
    IntPtr oldValue = IntPtr.Zero;
    try
    {
        if( Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432" ) == null )
            return false;

        Wow64DisableWow64FsRedirection( ref oldValue );
        if( File.Exists( path ) ) return true;

        return false;
    }
    finally
    {
        if( oldValue != IntPtr.Zero )
            Wow64RevertWow64FsRedirection( ref oldValue );            
    }   
}

تحديث: قد تحتاج أيضا إلى التحقق من إصدار نظام التشغيل قبل تعطيل إعادة توجيه WOW لأن الإصدارات السابقة من XP (ما قبل SP2 وأعمن أن) لا تعرض هذه الأساليب.

تحديث 2: إضافة نظام التشغيل التحقق من 64 بت. تنفذ جميع إصدارات 64 بت من نظام التشغيل هذه الطرق ولا تحتاج فقط إلى تعطيل Sate إذا كان يعمل على نظام تشغيل 64 بت.

نصائح أخرى

هل عمليةك 32 بت أو 64 بت؟ وهل السائقين 64 أو 32؟ ما أحصل عليه هو أنه ربما إعادة توجيهك OS OS المضيف إلى مجلد WOW64 بدلا من ذلك.

هل حاولت تعطيل المجلد الافتراضي لتطبيقك؟ ستحتاج إلى إضافة ملف واضح يحتوي على:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

ومع ذلك، إذا كنت بحاجة إلى الكتابة إلى هذه المجلدات، فسيتعين عليك طلب قدرة المشرف. وبعد للقيام بذلك، التغيير level="asInvoker" ل level="requireAdministrator" في XML.

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

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

أيضا، يمكنك محاولة القيام بملفات الدليل وتعداد الملفات التي تحتوي لمعرفة ما إذا كان أي شيء يبدو مألوفا.

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