2010-01-25 1 views
3

Мне нужна справочная система32/shell32.dll, так как я использую некоторые функции оболочки для считывания мусорного контейнера. Я попробовал «Добавить ссылку -> COM -> Microsoft Shell Controls and Automatation» и «Добавить ссылку -> Обзор ---> [прямо в system32/shell32.dll]. Оба добавляют ссылку на shell32 на мои ссылки Но когда я смотрю на свойства, я вижу, что путь ссылки выглядит так: «C: \ Users \ Tim \ Documents \ Visual Studio 2008 \ Projects \ Wing \ FileWing \ obj \ Debug \ Interop.Shell32.dll" ...C# Visual Studio 2008 Ссылка на system32.dll ... как?

Я не буду разворачивать этот \ obj \ Debug \ путь к моему установщику. Как я могу напрямую ссылаться на конечных пользователей shell32.dll? Есть ли способ? Почему VS2008 создает этот странный путь? Могу ли я изменить этот путь, чтобы он не сидит в этом странном вложенной?


Ммм. Хорошо после пересматривают PI nvoke, я уверен, что я не совсем понял: -/

Позвольте мне проиллюстрировать код, который мне нужно обработать. Я копаю в корзине и ищу предмет, который хочу восстановить. Есть ли какой-то способ НЕ сражаться, хотя 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; 
     } 
    } 

ответ

5

Я считаю, что вы ищете P/Invoke (Platform Invoke)

После того, как вы получите метод в том числе и с использованием библиотеки DLL вниз, вы можете посетить pinvoke.net, чтобы получить конкретные фрагменты кода для использования определенных методов.

+0

Да, вы не добавляете ссылку на shell32.dll (по крайней мере, через обычные ссылки Add), вместо этого вы используете P/Invoke. Есть целый веб-сайт, посвященный этому даже, http://www.pinvoke.net/ –

+0

Спасибо, я думаю, это все. Большое спасибо! – Akku

+0

Хорошо, я думаю, что я ищу что-то - проще. Написал следующий комментарий ниже, пожалуйста, повторите это ... Я довольно беспомощный. – Akku

0

После добавления ссылки dll с помощью VS 2008 вы можете открыть свойства для .dll.

Убедитесь, что для параметра Копировать местный установлено значение Истина.

Если это не сработает, другое решение - добавить DLL в качестве объекта в проект и сделать его как содержимое и передать его в каталог вывода.

2

Вы используете DllImport для доступа к функциям в shell32/kernel32? Если это так, вам не нужно добавлять ссылку.

Например:

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

Вот руководство по использованию platform invoke и вот MSDN article.