вторник, 30 апреля 2013 г.

Минимальный sudoers

Приходится пользоваться утилитой sudo, достаточно редко, чтобы забыть как правильно писать правила в файл sudoers, но достаточно часто, чтобы пожалеть время, растрачиваемое на ковыряние довольно сложного мануала по данной теме. Это команда, которая необходима каждому, кто пользуется юникс.
Итак - перед нами "коза" файла /etc/sudoers:
User_Alias USER1 = myName
Host_Alias LOCALHOST = myHost
Cmnd_Alias COMMAND1 = /path/to/my/programm.exe
USER1 LOCALHOST = NOPASSWD: COMMAND1
myName - наш логин в систему;
myHost - имя нашего компьютера;
Теперь мы можем выполнять нашу программу без ввода пароля:
#sudo /path/to/my/programm.exe
По аналогии можно добавить пользователя USER2, USER3 и т.д. или команду COMMAND1, COMMAND2 и т.д.

вторник, 2 апреля 2013 г.

Вызов диалоговых окон открытия-сохранения файла и выбора каталога в приложении Visual Studio

Рассмотрим создание стандартных диалогов для выбора файла или каталога в приложении, написанном на Visual C++.
В качестве шаблона будем использовать Dialog based приложение, созданное в предыдущем посте. Это стандартное, "пустое" Dialog based приложение, просто мы там добавили меню и обработчик его команды, которая вызывается когда мы щелкаем по пункту этого меню.
В этот обработчик (функция CCreatingMenuDlg::OnMytopmenuMymenuitem()) вместо старого вставляем новый код:
    CString a(TEXT("All Files (*.*)|*.*||")),
            b(TEXT("My File Dialog")),
            c(TEXT("Your file name is :"));

    CFileDialog fileDlg( TRUE,
                        NULL,
                        NULL,
                        OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY,
                        a,
                        this,
                        sizeof(OPENFILENAME)
                        );
    fileDlg.m_ofn.lpstrTitle = b;

    if ( fileDlg.DoModal() == IDOK)
    {
        CString szlstfile = fileDlg.GetPathName();
        CString res;
        res =  c + szlstfile;
        AfxMessageBox(res );
        ofstream flow1 (szlstfile);
        flow1 << "Ты сделал это!!!";
    }
При выборе этого пункта меню будет вызываться диалоговое окно, которое позволяет выбрать или создать файл, куда будет записана тестовая строка. Будьте осторожны при тестировании, чтобы не затереть какой-нибудь полезный файл.
Для работы с типом  ofstream (для демонстрируемой функциональности вообще-то нам последние две строчки кода что приведен выше не нужны) включим в файл CreatingMenu.h следующее:
#include<fstream>
#include
<iostream>
#include<string>
using namespace std;
Все. Теперь можно скомпилировать и запустить на выполнение.
Теперь напишем код для вызова диалога для выбора директории. Для этого в обработчик CCreatingMenuDlg::OnMytopmenuMymenuitem() вместо предыдущего вставим такой код:
    BROWSEINFO bi = { 0 };
    bi.lpszTitle = _T("Pick a Directory");
    bi.ulFlags |= BIF_NEWDIALOGSTYLE;
    LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
    if ( pidl != 0 )
    {
        TCHAR path[MAX_PATH];
        if ( SHGetPathFromIDList ( pidl, path ) )
        {
            //_tprintf ( _T("Selected Folder: %s\n"), path );
            CString a(path);
            CString res = TEXT("Your selected path is: ") + a;
            AfxMessageBox(res);
        }

         IMalloc * imalloc = 0;
        if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
        {
            imalloc->Free ( pidl );
            imalloc->Release ( );
        }
    }
 Компилируем и запускаем на выполнение.

Создание меню в Dialog Based приложении Visual Studio

Итак. Запускаем Visual Studio 2010. Создаем новый проект с именем CreatingMenu:
File->New->Project... (Ctrl+Shift+N)
Выбираем MFC Application и вводим имя проекта: CreatingMenu
Жмем ОК
Жмем Next >
Выбираем Dialog based
Жмем Next >
Убираем About box
Жмем Next >
Убираем ActiveX controls
 Жмем Next >
Жмем Finish
Видим такое:

(К такому "виду" мы можем придти через меню: View->Resource View (Ctrl+Shift+E))
Удаляем статический текст в центре диалога. Далее делаем щелчок правой кнопкой мыши в Resource View на имени нашего проекта CreatingMenu. Add->Resource...
Выбираем в списке Resource type: пункт Menu. Жмем кнопку New и видим такое:
Магической комбинацией щелчков мышью создаем MyTopMenu и MyMenuItem:
Делаем щелчок правой клавишей мыши на MyMenuItem и выбираем пункт
Add Event Handler...
Из списка Class list выбираем CCreatingMenuDlg и жмем Add and edit
Добавляем код в пустое тело обработчика событий:
    CString myMessage(TEXT("Ты сделал это!!!"));
    AfxMessageBox(myMessage);
Добавляем в класс CCreatingMenuDlg новый член:
 private:
    CMenu m_menu;
а в функцию CCreatingMenuDlg::OnInitDialog() код:
 if (!m_menu.LoadMenu(IDR_MENU1))
     AfxThrowResourceException();
  SetMenu(&m_menu);
Далее компилируем и запускаем на выполнение:

 Мы сделали это!!!