سؤال

أحتاج إلى System32/shell32.dll حيث أستخدم بعض وظائف الصدفة لقراءة سلة إعادة التدوير. لقد حاولت "إضافة مرجع-> com-> عناصر التحكم في شل Microsoft والأتمتة" و "إضافة مرجع-> تصفح ---> [الانتقال إلى System32/shell32.dll مباشرة]. يضيف كلاهما مرجع shell32 إلى مراجعاتي . لكن عندما أنظر إلى الخصائص ، أرى أن مسار المرجع يشبه هذا: "C: Users tim documents visual studio 2008 projects wing filewing obj debug interop.shell32.dll" ...

لن أقوم بنشر هذا obj debug path إلى المثبت الخاص بي. فكيف يمكنني الرجوع إلى المستخدمين النهائيين shell32.dll مباشرة؟ هل هناك طريقة؟ لماذا يخلق VS2008 هذا المسار الغريب؟ هل يمكنني تغيير هذا المسار حتى لا يجلس في هذا المجلد الفرعي الغريب؟


أمم. حسنًا ، بعد إعادة النظر في Pinvoke ، أنا متأكد من أنني لا أحصل عليه تمامًا:-/

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

    private void recoverRecyclerBinEntry(string fileName, int size)
    {
        try
        {
            Shell Shl = new Shell();
            Folder Recycler = Shl.NameSpace(10);

            // scans through all the recyclers entries till the one to recover has been found
            for (int i = 0; i < Recycler.Items().Count; i++)
            {
                FolderItem FI = Recycler.Items().Item(i);
                string FileName = Recycler.GetDetailsOf(FI, 0);
                if (Path.GetExtension(FileName) == "")
                    FileName += Path.GetExtension(FI.Path);
                //Necessary for systems with hidden file extensions.

                string FilePath = Recycler.GetDetailsOf(FI, 1);
                string combinedPath = Path.Combine(FilePath, FileName);

                if (size == FI.Size && fileName == combinedPath)
                {
                    Debug.Write("Match found. Restoring " + combinedPath + "...");
                    Undelete(FI);
                    Debug.WriteLine("done.");
                }
                else
                {
                    Debug.WriteLine("No match");
                }
            }
        } 
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            Debug.WriteLine(ex.StackTrace);
        }
    }

    private bool Undelete(FolderItem Item)
    {
        try
        {
            foreach (FolderItemVerb FIVerb in Item.Verbs())
            {
                if (
                    (FIVerb.Name.ToUpper().Contains("WIEDERHERSTELLEN")) ||
                    (FIVerb.Name.ToUpper().Contains("ESTORE")) ||
                    (FIVerb.Name.ToUpper().Contains("NDELETE"))
                    )
                {
                    FIVerb.DoIt();
                    return true;
                }
            }
            //execute the first one:
            Item.Verbs().Item(0).DoIt();
            return true;
        }
        catch (Exception)
        {
            Debug.WriteLine("ERROR undeleting");
            return false;
        }
    }
هل كانت مفيدة؟

المحلول

أعتقد أنك تبحث عن P/Invoke (منصة استدعاء)

بمجرد الحصول على الطريقة لتضمين واستخدام DLLS لأسفل ، يمكنك الزيارة pinvoke.net للحصول على مقتطفات رمز محددة لاستخدام طرق معينة.

نصائح أخرى

هل تستخدم فقط DllImport للوصول إلى وظائف في shell32/kernel32؟ إذا كان الأمر كذلك ، فأنت لا تحتاج إلى إضافة مرجع.

علي سبيل المثال:

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",  SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

إليك برنامج تعليمي للاستخدام منصة استدعاء وهنا MSDN مقالة - سلعة.

بعد إضافة مرجع DLL باستخدام VS 2008 ، يمكنك فتح خصائص .DLL.

تأكد من ضبط نسخة محلية على TRUE.

إذا لم ينجح ذلك ، فهو حل آخر هو إضافة .dll كعنصر لك ، وجعله هو المحتوى ، واطلبه للنسخ إلى دليل الإخراج.

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