system32.dllのC#のVisual Studio 2008のリファレンス...どうやって?

StackOverflow https://stackoverflow.com/questions/2133346

  •  22-09-2019
  •  | 
  •  

質問

私はごみ箱を読み出すために、いくつかのシェルの機能を使用すると、

私は、参照SYSTEM32 / shell32.dllのを必要としています。 [SYSTEM32に行く/直接のShell32.dll]> ---ブラウズ>の両方が私の参照にShell32は参照を追加します - 「 - > COM - >マイクロソフトシェルコントロールとAutomatation参照の追加」し、「参照の追加私が試してみました。 。私は、プロパティを見たときしかし、私はこのような参照ルックスのパスを参照してください:「C:\ Users \ユーザーティム\ドキュメント\ Visual Studioの2008 \プロジェクト\ウィング\ FileWing \ OBJ \デバッグ\ Interop.Shell32.dll」 ...

私は、インストーラにこの\ OBJ \デバッグ\パスを展開しないでしょう。だから、どのように私は、エンドユーザーが直接のShell32.dll参照することができますか?方法はありますか?なぜVS2008は、この奇妙なパスを作成しますか?それはこの奇妙なサブフォルダに座っていませんので、私はこのパスを変更することはできますか?

<時間>

うーん。オーケーのPInvokeを再訪した後、私はかなりそれを取得しないことを確信している: - /

私が処理するために必要なコードを示してみましょう。私はリサイクルビンかかわら掘り、私は回復したいという項目を模索しています。 PInvokeのはこれを成し遂げるためにかかわらず、戦っていない方法はありますか?

    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;
        }
    }
役に立ちましたか?

他のヒント

あなただけのを使用していますShell32は/カーネル32にアクセス機能にDllImport?その場合は、参照を追加する必要はありません。

例えば、

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",  SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);
ここでプラットフォーム呼び出しそしてここにあるMSDN 記事でます。

あなたはVS 2008を使用して、DLLの参照を追加したら、.dllファイルのプロパティを開くことができます。

ローカルコピーがTrueに設定されていることを確認します。

別のソリューションを動作しない場合は、プロジェクトあなたにアイテムとしての.dllを追加し、makeはコンテンツとして、出力ディレクトリにコピーし、それを伝えることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top