Domanda

Ho bisogno system32 riferimento / shell32.dll come uso di alcune funzioni di shell per leggere il cestino. Ho provato "Aggiungi riferimento -> COM -> Controlli Microsoft Shell e Automatation" e "Aggiungi riferimento -.> Browse ---> [andare al system32 / SHELL32.DLL direttamente] Sia aggiunge il riferimento Shell32 ai miei riferimenti . Ma quando guardo le proprietà, vedo il percorso di riferimento è simile al seguente: "C: \ Users \ Tim \ Documenti \ Visual Studio 2008 \ Projects \ Ala \ FileWing \ obj \ Debug \ Interop.Shell32.dll" ...

Non farò distribuire questo \ obj \ Debug \ percorso al mio programma di installazione. Così come posso fare riferimento gli utenti finali SHELL32.DLL direttamente? C'è un modo? Perché VS2008 creare questo strano percorso? Posso cambiare questo percorso in modo che non si siede in questo strano sottocartella?


Hmmm. Va bene, dopo la rivisitazione PInvoke, sono sicuro che non ho ben capito: - /

Permettetemi di illustrare il codice ho bisogno di gestire. Sto scavando anche se il cestino e cercare per un elemento che voglio recuperare. C'è un modo non combattere se la PInvoke per ottenere questo fatto?

    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;
        }
    }
È stato utile?

Soluzione

Credo che siete alla ricerca di P / Invoke (Platform Invoke)

Una volta che il metodo per l'inclusione e l'utilizzo delle DLL verso il basso, si può visitare pinvoke.net per ottenere frammenti di codice specifici per l'utilizzo di alcuni metodi.

Altri suggerimenti

Sono solo utilizzando DllImport per accedere alle funzionalità in shell32 / Kernel32? Se è così, non c'è bisogno di aggiungere un riferimento.

Ad esempio:

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

Ecco un tutorial su come utilizzare piattaforma invoke ed ecco una MSDN articolo .

Dopo aver aggiunto il riferimento DLL utilizzando VS 2008, è possibile aprire le proprietà per il dll.

Assicurarsi copia locale è impostata su true.

Se questo non funziona un'altra soluzione è quella di aggiungere il dll come un elemento per voi progetto, e fare è come contenuto, e dirgli di copiare nella directory di output.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top