Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка -выгрузка dll библиотеки, Загрузка -выгрузка dll библиотеки 
:(
    Опции темы
Perun
Дата 28.11.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



Работаю с оболочкой - надо добавить контекстное меню в системное!
Нашёл отличный пример - компилирую его(в свойствах проекта поставил галочку Register for COM Interop). Ура - моё меню появилось.
Теперь хочу от него избавится. Как выгрузить библиотеку???
То есть загрузка и выгрузка программно делается.
Задача такая: при загрузке формы меню появляется - при отключении пропадает.

PM MAIL ICQ   Вверх
GavriKos
Дата 28.11.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Пример в студию ) 
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Perun
Дата 29.11.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



Проект типа Class Library состоит из 4 файлов

Код

// *******************************************************************************
//    Title:            BatchResults.cs
//    Description:    Sample shell extension
// *******************************************************************************


using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;
using System.Windows.Forms;
using System.Diagnostics;

namespace ShellExt
{
    [Guid("6B3A1F0C-C382-40d6-AA13-33B0AB46EEAA")]
    public class BatchResultContextMenu: IShellExtInit, IContextMenu
    {
        #region Protected Members
        protected const string guid = "{6B3A1F0C-C382-40d6-AA13-33B0AB46EEAA}";
        protected string m_fileName;// файл, по которому щёлкнули
        protected string apStPath;// путь к нашей программе
        protected uint m_hDrop = 0;
        #endregion

        #region IContextMenu
        // IContextMenu
        int    IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags)
        {
            // Create the popup to insert
            uint hmnuPopup = Helpers.CreatePopupMenu();

            int id = 1;
            if ( (uFlags & 0xf) == 0 || (uFlags & (uint)CMF.CMF_EXPLORE) != 0)
            {
                uint nselected = Helpers.DragQueryFile(m_hDrop, 0xffffffff, null, 0);
                if (nselected == 1)
                {
                    StringBuilder sb = new StringBuilder(1024);
                    Helpers.DragQueryFile(m_hDrop, 0, sb, sb.Capacity + 1);
                    m_fileName = sb.ToString();

                    // Populate the popup menu with file-specific items
                    id = PopulateMenu(hmnuPopup, idCmdFirst+ id);
                }
                //if (nselected == 2)// 2 уровень вложенности
                //{
                //    StringBuilder sb = new StringBuilder(1024);
                //    Helpers.DragQueryFile(m_hDrop, 0, sb, sb.Capacity + 1);
                //    m_fileName = sb.ToString();

                //    // Populate the popup menu with file-specific items
                //    id = PopulateMenu(hmnuPopup, idCmdFirst + id);
                //}
                    
                // Добавление выпадающего меню в контекстное(Add the popup to the context menu)
                MENUITEMINFO mii = new MENUITEMINFO();
                mii.cbSize = 48;
                mii.fMask = (uint) MIIM.TYPE | (uint)MIIM.STATE | (uint) MIIM.SUBMENU;
                mii.hSubMenu = (int) hmnuPopup;
                mii.fType = (uint) MF.STRING;
                mii.dwTypeData = "Это мой пункт";
                mii.fState = (uint) MF.ENABLED;
                Helpers.InsertMenuItem(hMenu, (uint)iMenu, 1, ref mii);

                // Добавляем разделитель(Add a separator)
                MENUITEMINFO sep = new MENUITEMINFO();
                sep.cbSize = 48;
                sep.fMask = (uint )MIIM.TYPE;
                sep.fType = (uint) MF.SEPARATOR;
                Helpers.InsertMenuItem(hMenu, iMenu+1, 1, ref sep);
            
            }
            return id;
        }

        void AddMenuItem(uint hMenu, string text, int id, uint position)
        {
            MENUITEMINFO mii = new MENUITEMINFO();
            mii.cbSize = 48;
            mii.fMask = (uint)MIIM.ID | (uint)MIIM.TYPE | (uint)MIIM.STATE;
            mii.wID    = id;
            mii.fType = (uint)MF.STRING;
            mii.dwTypeData    = text;
            mii.fState = (uint)MF.ENABLED;
            Helpers.InsertMenuItem(hMenu, position, 1, ref mii);
        }

        int PopulateMenu(uint hMenu, int id)
        {
            // Захватываем информацию о файле(Grab some info about the file)
            bool done = ProcessBatchResults(); 

            if (done)
            {
                //AddMenuItem(hMenu, "Reschedule", id, 0);
                //AddMenuItem(hMenu, "Retry Now", ++id, 1);
                //AddMenuItem(hMenu, "Cancel", ++id, 2);
                AddMenuItem(hMenu, "Зашифровать", id, 0);                
                AddMenuItem(hMenu, "Расшифровать", ++id, 1);
                AddMenuItem(hMenu, "Подписать", ++id, 2);
            }
            else
            {
                // Uses 100-baed values to distinguish on the "done" status
                AddMenuItem(hMenu, "Commit", 100 + id, 0);
                AddMenuItem(hMenu, "Rollback", 100 + (++id), 1);
            }

            return id++;
        }
        
        bool ProcessBatchResults()
        {
            FileInfo fi = new FileInfo(m_fileName);
            return (fi.Length >0);
        }


        void IContextMenu.GetCommandString(int idCmd, uint uFlags, int pwReserved, StringBuilder commandString, int cchMax)
        {
            switch(uFlags)
            {
            case (uint)GCS.VERB:
                commandString = new StringBuilder("...");
                break;
            case (uint)GCS.HELPTEXT:
                commandString = new StringBuilder("..."); 
                break;
            }
        }

        
        void IContextMenu.InvokeCommand (IntPtr pici)
        {
            try
            {// здесь указываем на выполнение наших команд
                Type typINVOKECOMMANDINFO = Type.GetType("ShellExt.INVOKECOMMANDINFO");
                INVOKECOMMANDINFO ici = (INVOKECOMMANDINFO)Marshal.PtrToStructure(pici, typINVOKECOMMANDINFO);
                switch (ici.verb-1)
                {
                    case 0:
                        Encrypt();
                        break;
                    case 1:
                        Decrypt(); 
                        break;
                    case 2:
                        RetryNowJob();
                        break;
                    case 100:
                        CommitJob();
                        break;
                    case 101:
                        RollbackJob();
                        break;
                }
            }
            catch(Exception)
            {
            }
        }
        #endregion

        #region IShellExtInit
        int    IShellExtInit.Initialize (IntPtr pidlFolder, IntPtr lpdobj, uint hKeyProgID)
        {
            try
            {
                if (lpdobj != (IntPtr)0)
                {
                    // Get info about the directory
                    IDataObject dataObject = (IDataObject)Marshal.GetObjectForIUnknown(lpdobj);
                    FORMATETC fmt = new FORMATETC();
                    fmt.cfFormat = CLIPFORMAT.CF_HDROP;
                    fmt.ptd         = 0;
                    fmt.dwAspect = DVASPECT.DVASPECT_CONTENT;
                    fmt.lindex     = -1;
                    fmt.tymed     = TYMED.TYMED_HGLOBAL;
                    STGMEDIUM medium = new STGMEDIUM();
                    dataObject.GetData(ref fmt, ref medium);
                    m_hDrop = medium.hGlobal;
                }
            }
            catch(Exception)
            {
            }
            return 0;
        }

        #endregion
        
        #region Private Members
        // команда зашифровать->Личный ключ->EFS, временно просто зашифровать
        private    void Encrypt()
        {
            // здесь указываем, какое действие будет происходить            
            try
            {
                Process process = new Process();
                // шифруем выбранный файл
                process.StartInfo.CreateNoWindow = false;
                process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                string ap = @"C:\Windows\system32\cipher.exe ",//Path. + "\\Utils\\cipher.exe",
                       paramz = " /e /a " + Path.GetFileName(m_fileName);                
                process.StartInfo.Arguments = paramz; // тут строка типа winrar.exe -ed -f
                process.StartInfo.FileName = ap;
                process.Start();
                process.WaitForExit();

                MessageBox.Show("Файл \"" + m_fileName/*Path.GetFileName(m_fileName)*/ + "\" зашифрован успешно!",
                                "FrontLine", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка во время шифрования папки!\n" + exc.Message,
                                   "FrontLine", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }                
            //MessageBox.Show("Gotta cancel the job", Path.GetFileName(m_fileName));
        }
        // команда Расшифровать
        private    void Decrypt()
        {
            Process process = new Process();
            // шифруем выбранный файл
            process.StartInfo.CreateNoWindow = false;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            string ap = @"C:\Windows\system32\cipher.exe ",//Path. + "\\Utils\\cipher.exe",
                   paramz = " /d /a " + Path.GetFileName(m_fileName);
            process.StartInfo.Arguments = paramz; // тут строка типа winrar.exe -ed -f
            process.StartInfo.FileName = ap;
            process.Start();
            process.WaitForExit();
            MessageBox.Show("Файл \"" + Path.GetFileName(m_fileName) + "\" расшифрован успешно!",
                            "FrontLine", MessageBoxButtons.OK, MessageBoxIcon.Information);            
            //MessageBox.Show("Gotta reschedule the job", Path.GetFileName(m_fileName));
        }
        private    void RetryNowJob()
        {
            MessageBox.Show("Gotta retry the job NOW", Path.GetFileName(m_fileName));
        }
        private    void CommitJob()
        {
            MessageBox.Show("Gotta commit the job", Path.GetFileName(m_fileName));
        }
        private    void RollbackJob()
        {
            MessageBox.Show("Gotta rollback the job", Path.GetFileName(m_fileName));
        }
        #endregion

        #region Registration
        [System.Runtime.InteropServices.ComRegisterFunctionAttribute()]
        static void DLLRegisterServer(String str1)
        {
            try
            {
                // For Winnt set me as an approved shellex
                RegistryKey root;
                RegistryKey rk;
                root = Registry.LocalMachine;
                
                rk = root.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", true);
                //rk.SetValue(guid.ToString(), "BatchResults shell extension");
                rk.SetValue(guid.ToString(), "MyContextMenu extension");                
                rk.Close();

                // Set "Folder\\shellex\\ContextMenuHandlers\\BatchResults" regkey to my guid
                root = Registry.ClassesRoot;
                //rk = root.CreateSubKey("BatchResultsFile\\shellex\\ContextMenuHandlers\\BatchResults");
                rk = root.CreateSubKey("*\\shellex\\ContextMenuHandlers\\MyContextMenu");// новое
                rk = root.OpenSubKey("*\\shellex\\ContextMenuHandlers\\MyContextMenu",true);// новое
                rk.SetValue("", guid.ToString());
                rk.Close();
            }
            catch(Exception e)
            {
                System.Console.WriteLine(e.ToString());
            }
        }

        [System.Runtime.InteropServices.ComUnregisterFunctionAttribute()]
        static void DllUnregisterServer(String str1)
        {
            try
            {
                RegistryKey root;
                RegistryKey rk;

                // Remove ShellExtenstions registration
                root = Registry.LocalMachine;
                rk = root.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", true);
                rk.DeleteValue(guid);
                rk.Close();

                // Delete  regkey
                root = Registry.ClassesRoot;
                //root.DeleteSubKey("BatchResultsFile\\shellex\\ContextMenuHandlers\\BatchResults");
                root.DeleteSubKey("*\\ShellEx\\ContextMenuHandlers\\SimpleShlExt");
            }
            catch(Exception e)
            {
                System.Console.WriteLine(e.ToString());
            }
        }
        #endregion

    }
}




[code=csharp]

Добавлено через 4 минуты и 10 секунд
Осталное в прикреплённом файле

Добавлено через 4 минуты и 41 секунду
Основная работа в файлике batchresults. Для чего нужен Commands не понятно.
Мне необходимо увеличить вложенность контекстного меню. Там, где расшифровать-> ещё пункт, а  ещё 1.
Типа структуры
п.0 
     0.1
        0.1.1
          0.1.1.1
          0.1.1.2
     0.2
     0.3
На форме моего основонго приложения(они не связаны) 2 кнопки:
загрузить контекстное меню
выгрузить контекстное меню


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  code.txt 28,19 Kb
PM MAIL ICQ   Вверх
Perun
Дата 29.11.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



усли есть возможность ответь пожалуйста побыстрее
PM MAIL ICQ   Вверх
Perun
Дата 29.11.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



Надо разобраться сначала с методом QueryContextMenu(...)
Мне надо добавить вложенность, пока не отследил как
есть методы PopulateMenu() и AddItem() 
PM MAIL ICQ   Вверх
GavriKos
Дата 30.11.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Влоб DeleteMenuItem юзал?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Perun
Дата 1.12.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



Поподробнее DeleteMenuItem(). Что мне удалять и чем??. 
Я прочитал несколько статей(на англ правда) про создание оболочек - там только такой путь описан!Я нашёл пример и разобрал его вроде бы, но применить к своей программе не могу.
Меня правильно поняли?
Я хочу, чтобы при запуске моей проги в системное меню файла
встраивалось моё контекстное меню(3-й вложенности!). А по выходе из проги
оно пропадало. Винрар и 7-zip пожожие вещи делают, только они не выгружаются.

 
PM MAIL ICQ   Вверх
Certain
Дата 1.12.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Так в чем проблема? И зачем библиотека? 2 функции напиши на запись в реестр и удаления соответственно

пример

с вложениями, я думаю, ты сам разберешься, посмотри на примере других ключей(winrar)
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Perun
Дата 1.12.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



Думаешь я эту статью не видел?
Если б было так просто я бы не создал тему.
Попробуй сам вложенность сделать, хотя бы на 3 уровня:
1
  1
    1
Буду благодарен!
PM MAIL ICQ   Вверх
Perun
Дата 2.12.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.8.2007
Где: Краснодар

Репутация: нет
Всего: нет



решил вопрос с загрузкой/ выгрузкой dll, но
на другой машине не работает. Прога запускается, кнопки нажимаются - но меню не появляется
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.