Question

J'ai besoin la référence system32 / shell32.dll que j'utilise quelques fonctions shell pour lire le bac de recyclage. J'ai essayé « Ajouter une référence -> COM -> Contrôles Microsoft Shell et Automatation » et « Ajouter Référence -.> Parcourir ---> [aller au system32 / SHELL32.dll directement] Les deux ajoute la référence shell32 à mes références . Mais quand je regarde les propriétés, je vois le chemin de la référence ressemble à ceci: "C: \ Users \ Tim \ Documents \ Visual studio 2008 \ Projects \ Wing \ FileWing \ obj \ Debug \ Interop.Shell32.dll" ...

Je ne vais pas déployer cette \ obj \ chemin Debug \ à mon programme d'installation. Alors, comment puis-je faire référence aux utilisateurs finaux SHELL32.dll directement? Est-il possible? Pourquoi VS2008 créer ce chemin étrange? Puis-je changer ce chemin il ne siège pas dans ce sous-dossier étrange?


Hmmm. Bon après revisiter PInvoke, je suis sûr que je ne comprends pas bien: - /

Permettez-moi d'illustrer le code que je dois gérer. Je creuse si le bac de recyclage et de rechercher un élément que je veux récupérer. Y at-il moyen de ne pas se battre si le PInvoke pour y parvenir?

    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;
        }
    }
Était-ce utile?

La solution

Je crois que vous cherchez P / Invoke (Platform Invoke)

Une fois que vous obtenez la méthode pour inclure et en utilisant les DLL vers le bas, vous pouvez visiter pinvoke.net obtenir des extraits de code spécifiques pour l'utilisation de certaines méthodes.

Autres conseils

Vous utilisez juste DllImport pour accéder aux fonctionnalités shell32 / kernel32? Si oui, vous n'avez pas besoin d'ajouter une référence.

Par exemple:

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

Voici un tutoriel sur l'utilisation plate-forme Invoke et est ici un MSDN article .

Une fois que vous ajoutez la référence dll en utilisant VS 2008, vous pouvez ouvrir les propriétés du .dll.

Assurez-vous est défini que la copie locale sur True.

Si cela ne fonctionne pas une autre solution est d'ajouter le fichier .dll comme un élément à votre projet, et de faire est aussi le contenu, et lui dire copier dans le répertoire de sortie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top