Frage

Ich brauche die Referenz system32 / shell32.dll als ich einige Shell-Funktionen verwenden, um den Papierkorb auszuzulesen. Ich habe versucht, „Referenz hinzufügen -> COM -> Microsoft Shell Bedienelemente und Automatation“ und „Referenz hinzufügen -> Browse ---> [gehen die system32 / shell32.dll direkt] Beide fügt die shell32 Bezug auf meine Referenzen. . Aber wenn ich mir die Eigenschaften sehen, ich den Weg der Referenz sieht wie folgt sehen: "C: \ Users \ Tim \ Documents \ Visual Studio 2008 \ Projects \ Flügel \ FileWing \ obj \ Debug \ Interop.Shell32.dll" ...

Ich werde nicht implementieren diese \ obj \ Debug \ Pfad zu meinem Installer. Also, wie kann ich die Endnutzern SHELL32.DLL direkt verweisen? Gibt es einen Weg? Warum VS2008 diesen seltsamen Pfad erstellen? Kann ich diesen Pfad ändern, damit es nicht in diesem seltsamen Unterordner sitzen?


Hmmm. Okay, nach dem erneuten Besuch PInvoke, ich bin sicher, dass ich recht versteht es nicht: - /

Lassen Sie mich den Code illustriere ich behandeln müssen. Ich bin zu graben, obwohl der Recyclingbehälter und suchen nach einem Artikel, dass ich wiederherstellen möchten. Gibt es eine Möglichkeit nicht zu kämpfen, obwohl die PInvoke dies zu tun bekommen?

    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

Ich glaube, Sie suchen P / Invoke (Platform Invoke)

Wenn Sie die Methode erhalten für die Aufnahme und Verwendung der DLLs nach unten, können Sie unter pinvoke.net erhalten spezifischen Code-Schnipsel für die Nutzung bestimmter Methoden.

Andere Tipps

Verwenden Sie nur DllImport Zugriffsfunktionalität in shell32 / kernel32? Wenn ja, brauchen Sie nicht einen Verweis hinzuzufügen.

Zum Beispiel:

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

Hier ist ein Tutorial zur Verwendung von Plattformaufruf und hier ist ein MSDN Artikel .

Nachdem Sie die DLL-Referenz mit VS 2008 hinzufügen, können Sie die Eigenschaften für die DLL öffnen.

Stellen Sie sicher, Copy Local auf True gesetzt ist.

Wenn das nicht eine andere Lösung funktioniert ist die DLL als ein Element hinzufügen, um Ihr Projekt und machen ist als Inhalt, und melden Sie es in das Ausgabeverzeichnis kopiert werden.

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