Frage

Hmmm. Okay, nach dem erneuten Besuch PInvoke, ich bin sicher, dass ich recht versteht es nicht: - / (nur gefragt diese Frage )

Lassen Sie mich den Code illustriere ich behandeln müssen. Es funktioniert, wenn ich "Add Reference -> COM -> Microsoft Shell Bedienelemente und Automatation" ... aber leider stellt es eine Referenz in meinem Projekt, dass wie folgt aussieht: „C: \ Users \ Tim \ Documents \ Visual Studio 2008 \ Projects \ Flügel \ FileWing \ obj \ Debug \ Interop.Shell32.dll "

Ich bin zu graben, obwohl der Papierkorb und suchen nach einem Artikel, dass ich wiederherstellen möchten. Gibt es eine Möglichkeit nicht durch die PInvoke kämpfen dies zu tun bekommen? Oder einen Verweis auf die system32 bekommen / shell32.dll, die ich diesen Code zur Laufzeit verwenden läßt?

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;
    }
}
War es hilfreich?

Lösung

Im Moment Sie mischen 2 unterschiedliche Konzepte: PInvoke und COM-Interop.

PInvoke können Sie native C-Funktionen für den Zugriff aus verwalteten Code. Es funktioniert durch einen Marschall kompatibele Unterzeichnung der nativen Methode in verwaltetem Code zu definieren und es mit dem Attribute DllImport Markierung. Es erfordert, und nicht haben kann, einen Metadaten Bezug auf die native DLL. Die DLL zur Laufzeit mit normaler Belastung Regeln für einen Win32-DLL entdeckt wird.

COM-Interop ermöglicht Ihnen den Zugriff auf COM-kompatiblen Objekten von verwalteten Code. Dies wird durch immer einen Marschall kompatibel verwaltete Definition der COM-Schnittstelle erfolgen und dann in einem von mehreren Möglichkeiten, eine referece auf das Objekt zu gewinnen. die verwaltete Definition erhalten wird häufig durch Mittel erreicht einen Metadaten Bezug auf die PIA des Addierens (primäres Interopassembly) für die COM-Komponente. Bis C # 4.0, kann diese Referenz nicht ohne viel Arbeit entfernt werden und müssen mit Ihrer Anwendung bereitgestellt werden.

In diesem speziellen Beispiel Sie verwenden COM-Interop und nicht PInvoke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top