سؤال

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

اسمحوا لي أن أوضح الرمز الذي أحتاجه إلى التعامل معه. إنه يعمل عندما أستخدم "إضافة مرجع -> com -> عناصر التحكم في شل Microsoft والأتمتة" ... ولكن للأسف ، يضع مرجعًا في مشروعي يبدو مثل هذا: "C: Users tim documents Visual Studio 2008 Projects Wing Filewing obj debug interop.shell32.dll "

أنا أحفر على الرغم من سلة إعادة التدوير وأبحث عن عنصر أريد استرداده. هل هناك أي طريقة لا تقاتل من خلال Pinvoke لإنجاز هذا؟ أو للحصول على إشارة إلى System32/shell32.dll التي تتيح لي استخدام هذا الرمز في وقت التشغيل؟

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;
    }
}
هل كانت مفيدة؟

المحلول

أنت الآن تقوم بخلط مفهمين مختلفين: Pinvoke و Com interop.

يتيح لك Pinvoke الوصول إلى وظائف C الأصلية من داخل الكود المدارة. إنه يعمل من خلال تحديد توقيع متوافق مع المارشال للطريقة الأصلية في التعليمات البرمجية المدارة ووضع علامة عليها مع DllImport ينسب. يتطلب ، ولا يمكن أن يكون ، إشارة بيانات التعريف إلى DLL الأصلي. يتم اكتشاف DLL في وقت التشغيل باستخدام قواعد التحميل العادية لـ Win32 DLL.

يتيح لك com interop الوصول إلى الكائنات المتوافقة مع COM من التعليمات البرمجية المدارة. يتم ذلك عن طريق الحصول على تعريف مُدارة متوافق مع المارشال لواجهة COM ثم الحصول على إحالة إلى الكائن في واحدة من عدة طرق. غالبًا ما يتم تحقيق التعريف المدارة عن طريق إضافة إشارة بيانات التعريف إلى PIA (مجموعة interop الأولية) لمكون COM. حتى C# 4.0 ، لا يمكن إزالة هذا المرجع ، دون الكثير من العمل ، ويجب نشره مع طلبك.

في هذا المثال بالذات ، تستخدم com interop وليس Pinvoke.

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