Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #85


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No85 (2009-12-31).

Здравствуйте, уважаемые читатели!

Создание собственного графического элемента управления с использованием библиотеки MFC.

Часть 3.



Автор: Алексей1153.
Дата написания: 20.12.2009.
Права на статью принадлежат автору и Клубу программистов «Весельчак У».

Содержание.



Становимся родителями.


Подошло время самостоятельности нашего класса CMyControl. Теперь он сам станет родительским классом. Как видите, весь код, который мы написали в первых двух частях, довольно общий и может содержаться в любом графическом ЭУ. Поэтому, недолго думая, будем производить от CMyControl потомков, а сам класс ещё будем дополнять. Например, точно понадобится сделать функцию CMyControl::PaintRoom виртуальной, чтобы производный класс мог рисовать в области Room.


Код:
class CMyControl:public CStatic

{
...
...
public:
virtual void PaintRoom(CDC& dc,const CRect& RoomRect);
...
...
};

Кстати, в потомке именно поэтому даже не придётся обрабатывать сообщение WM_PAINT.


Реверси.


Думал, что бы такое сделать, оформились три мысли, но две из них более безумны, чем третья (если время будет — я их тоже реализую и приложу :) ). Сделаем известную игру «Реверси». Понимаю, что всем уже надоел этой игрой, но предыдущая реализация мне очень не понравилась, всегда хотелось переписать, поэтому воспользуюсь случаем.


Правила игры.


Правила игры простые, как всё гениальное. Материал цитаты с правилами взят отсюда: Википедия — Реверси.

В игре используется квадратная доска размером 8 * 8 клеток (все клетки могут быть одного цвета) и 64 специальные фишки, окрашенные с разных сторон в контрастные цвета, например, в белый и чёрный. Клетки доски нумеруются от верхнего левого угла: вертикали — латинскими буквами, горизонтали — цифрами. Один из игроков играет белыми, другой — чёрными. Делая ход, игрок ставит фишку на клетку доски «своим» цветом вверх.

В начале игры в центр доски выставляются 4 фишки: чёрные на d5 и e4, белые на d4 и e5.

  • Первый ход делают чёрные. Далее игроки ходят по очереди.
  • Делая ход, игрок должен поставить свою фишку на одну из клеток доски таким образом, чтобы между этой поставленной фишкой и одной из имеющихся уже на доске фишек его цвета находился непрерывный ряд фишек соперника, горизонтальный, вертикальный или диагональный (другими словами, чтобы непрерывный ряд фишек соперника оказался «закрыт» фишками игрока с двух сторон). Все фишки соперника, входящие в «закрытый» на этом ходу ряд, переворачиваются на другую сторону (меняют цвет) и переходят к ходившему игроку.
  • Если в результате одного хода «закрывается» одновременно более одного ряда фишек противника, то переворачиваются все фишки, оказавшиеся на всех «закрытых» рядах.
  • Игрок вправе выбирать любой из возможных для него ходов. Если игрок имеет возможные ходы, он не может отказаться от хода. Если игрок не имеет допустимых ходов, то ход передаётся сопернику.
  • Игра прекращается, когда на доску выставлены все фишки или когда ни один из игроков не может сделать ход. По окончании игры проводится подсчёт фишек каждого цвета, и игрок, чьих фишек на доске выставлено больше, объявляется победителем. В случае равенства количества фишек засчитывается ничья.

Класс CReversi:public CMyControl.


Добавим в проект файлы класса нового ЭУ CReversi.


...


Целиком прочесть статью можно на нашем сайте, в разделе «Программирование в ОС::Windows».


  • Программирование :: Общий
  • Здравствуйте уважаемые.
    Вопрос к пользователям Eclipse Gallileo: где указывать путь к GCC compiller'у?
  • Программирование :: .NET технология от и до
  • Жизнь продолжается, но уже в другом направлении.  :mrgreen:
    Есть тест-проект на c#. Теперь хотят сделать проект на с++, в котором было бы возможно вызывать уже готовые тесты из моего c#-проекта.
    Ну а для этого надо их как-то поженить...  :shuffle:

    Нашла вот такие статьи:

    http://www.computerbase.de/forum/showthread.php?t=636766 (эта на немецком, но код читабелен ;-) )
    В ней идет ссылка на эту статью - уже на английском:
    http://www.csharphelp.com/2006/5/c-classes-as-com-objects/

    Сделала 2 учебных проекта (на c# - CsharpCode, на с++ - NativeCode).
    Попыталась реализовать то, что написано. Имею:
    1) с++-пример с немецкой страницы не компилируется вообще
    2) пример с англоязычной страницы компилируется, но при попытке вызова CoCreateInstance() возвращает неутешительный результат "CoCreateInstance has not been called"...

    Осталось по мелочам понять - и где же собака зарыта?  :-/ :dontknow: :confused:

    Да, насчет c#-проекта:
    - есть возможность либо каждому классу добавить парметр
    [System.Runtime.InteropServices.ComVisible(true)]
    - а можно в настройках проекта сказать "build -> register for com interop "

    пробовала включать их по очереди и все вместе - на результат это не повлияло... :(

    И еще - команды для создания tlb и регистрации длл-ли я написала в конце файла ManagedCode.cs.
    Все это удобноо вызывать из старт->программы->microsoft .net framework sdk 2.0 -> sdk command prompt

    Соответственно вопрос - может кто-то уже с этим сталкивался?
    Уже самой интересно стало!
  • Программирование :: С/С++
  • У меня такой вопрос: можно ли создавать два экземпляра одного пространства имен? Скорее всего, вопрос непонятен, так что покажу с помощь кода:
    Код:
    namespace main, sub1
    {
    ...
    };

    namespace main, sub2
    {
    ...
    }

    И в таком случае можно "подключать" либо всё
    Код:
    using namespace main;
    либо отдельные блоки main'а
    Код:
    using namespace sub1;
    или
    Код:
    using namespace sub2;
  • Есть некий класс:
    Код:
    class A
    {
    public:
    void foo() { printf("dfsa"); }
    };
    Ниже пишу:
    Код:
     A a();
    a.foo();
    но выдает
    Цитировать
    D:\Eugene\Temp\w32ca\w32ca.cpp(176) : error C2228: left of '.foo' must have class/struct/union type
    .
    Почему? Разве А не класс?

    P.S. Использую:
    Код:
    #include <stdafx.h>
    #include <iostream>
    #include <afx.h>
    #include <fstream.h>
    #include <windows.h>
    #include <string.h>
    У меня Microsoft Visual Studio 6.0
  • Код:
    __int64 getFileSize(const char * const file_path)
    {
    __int64 size = 0;

    ifstream fin(file_path, std::ios::binary);
    if(fin)
    {
    char read;
    while(!fin.eof())
    {
    fin >> read;
    ++size;
    }
    fin.close();
    }

    return size;
    }
    Почему этот код пропускает пробелы, символы переноса строки, символы табуляции?
  • Народ, нужна помощь. Кто-нибудь сталкивался с использованием Pro*C/C++ на С++?
    Дело в том, что сам по себе Pro*C/C++ совершенно не-объектноориентированный, я бы даже сказал наоборот: многое сделано через препроцессор.
    Моя задача в том, что нужно его использовать на С++, причем в рамках иерархии классов. Если кто сталкивался, буду очень признателен. Тогда задам много конкретных вопросов.
  • Изучаю потоки на примере простенькой игрушки - пакмене. Возникли проблемы со скоростью приложения: процессор загружается на ~100% и сама игрушка тормозит  :lamer2:

    Есть 5 разных существ (пакмен и враги), для каждого запускается по отдельному потоку. В каждом потоке - бесконечный цикл, в котором несколько проверок плюс изменение координаты, а для врагов еще поиск пути (пока что почти пустой). После изменения координаты - Sleep (creatureSpeed).
    С одним таким потоком (один пакмен бегает по карте) загрузка процессора - 30-40%. А с 5-ю еще вдобавок скорость перемещения существ падает (видимо к Sleep-у добавляется не такое уж и маленькое время расчетов)

    В общем, вопрос: как сделать правильно?

  • Привет! Как програмно создавать массивы, например, по событию, чтоб они были необходимого мне, на момент срабатывания события, объема?
  • Цитата: Вад link=topic=21895.msg215451#msg215451 date=1254214350
    А, да. Собственно, мне случалось использовать это решение и не для шаблонов :) Когда требовалось резко снизить время на компиляцию-линковку.
    Вад, не понимаю как можно резко снизить время на линковку и тем более на компиляцию делая инклуд cpp файла? По идее для компилятора нет никакой разницы какое расширение у файла, можно все писать в cpp, можно все писать в h файлах, нет никакой разницы кроме удобства (собственно поэтому и разделили).
  • Объясните, как можно реализовать данную задумку. Есть, к примеру, следующий класс:
    Код:
    extern int f(int value);
    class A
    {
    int m_value;
    public:
    void SetValue(int value){m_value=f(value);}
    int GetValue()const{return m_value;}
    };
    Хотелось бы организовать чтение и изменение значение члена-класса m_value через одну функцию, что-нибудь на подобиe:
    Код:
    A a;
    a.Value():=3;
    Как это можно сделать???
  • int Process::action(string a)
    {
    system(a.c_str());
    return 0;
    }

    что происходит в этом куске?
    и для чего вообще используется a.c_str()?
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Возникла необходимость реализовать в своей программе (пишу на vs 2008 express) property sheet с помощью winapi. Желательно сделать примерно как в студии: убраны стандартные кнопки, размер окна неограничен, используется прокрутка.

    В связи с этим 3 проблемы-вопроса:
    1) При работе с окошком property sheet главное окно теряет фокус, и наоборот (см. картинку).
    2) Неограниченный размер окна симулируется заданием больших значений размеров в ресурсных шаблонах для страниц  контрола. Может быть возможно динамически изменять их размер? Или есть способ лучше для симуляции такого поведения?
    3) Не совсем по property sheet, более общая: как сменить стиль отображения стандартных контролов? (см. картинку)

    Код не привожу, в связи с достаточно общими вопросами, но собрал тестовый пример. Посмотрите, подскажите, если не трудно.
    Пример состоит из простого окошка с дочерними статус баром, рабочим скролл баром и листом свойств. Так же см. картинку.
    P.S. Про конкурентов - ну, наверное, не стоит уточнять, что это такой дерзкий юмор :)

  • Наверное, сразу нужно уточнить, что пользуюсь vs 2008 express, в которой отсутствует MFC.

    Ну а мой вопрос в том, если обобщая, как правильно разместить окошко диалога в классе. Ведь процедура окна в классе должна быть объявлена статической, значит и используемые в ней переменные тоже. В связи с этим, возникают проблемы.

    Вот конкретный пример: пользовательское окошко подсказки (tooltip).

    -- В конструкторе m_hWndToolTip = CreateWindow (), диалоговая процедура TTDlgProc ().
    -- static vector<ETOOLINFO>vTools; - массив структур добавленных инструментов, содержащий и оригинальные процедуры этих интрументов.
    -- SubclassProc  () - субклассинг, эта процедура использует информацию из vTools (оригинальные процедуры инструментов под субклассингом), указатель m_hWndToolTip и т.д.

    Код:
    class EncToolTip
    {
    ...

    // Tooltip window:
    private:
    static HWND m_hWndToolTip;
    static HWND m_hWndTTStatic;
    private:
    static LRESULT CALLBACK TTDlgProc (HWND, UINT, WPARAM, LPARAM);

    // Tools:
    private:
    static vector<ETOOLINFO>vTools;     // Массив структур
    static ETTADATA adata;                      // Структура вспомогательных данных
    private:
    static LRESULT CALLBACK SubclassProc (HWND, UINT, WPARAM, LPARAM);

    ...
    };

    Ну так вот, все прекрасно работает, пока не пытаешься создать второй экземпляр данного класса  :shuffle:
    Подскажите, пожалуйста, как сделать правильно.

    Использую express постоянно, все время возникает желание организовать контролы в иерархию. Может быть такое уже релизовано?

  • как считать из файла unicode и utf8 строки? ( определения самой кодировки не требуется, тк считается что на ввод подается файл в нужной кодировке: либо utf8.RU, либо unicode )

    как ее вывести на /subsystem:console?

    Код:
     std::ifstream tf;
    tf.open("text.txt");
    std::string s;
            tf>>s;
    cout<<s<<endl;
  • Уважаемые, подскажите если кто сталкивался и решил проблему.

    Есть база на Access.

    И мне надо с ней работать. В 32-х разрядной операционке все без проблем.
    В 64-х разрядной ни в какую. Пишет, что драйвер не найден.

    Нашел в интернете что в 64-х разрядной ос есть 32-х разрядные драйвера windows\system\wow64\odbc... - как-то так.
    Они там действительно есть, а вот как к ним достучаться из программы, поскольку 64-х разрядных Jet нет и не будет.
    А по умолчанию обращение идет к 64-х разрядным драйверам.

    Технология доступа что ADO, что DAO не работает естественно ни та ни другая.
  • Программирование :: С/С++ :: Borland C/C++
  • Люди..у меня есть файл и когда данные в нем заканчиваются, считывание должно опять начинаться с начала..Как это реализовать? Borland Turbo C++
    Пробовала снова input_file.close();
    ifstream input_file("Menu1.txt"); но считывание опять продолжается с того же места..
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Допустим, я записываю в лист формулу, делящую одну переменную (c1) на вторую(c2)

    c1/c2

    Пусть макрос знает допустим значения c1 и c2.

    Что надо сделать, чтобы при взятии формулы из ячейки она интерпритировалась не как текст, а как результат решения этой формулы: c1/c2?
  • Программирование :: Java
  • Здравствуйте.
    Вот, натолкнулся на такую проблему: класс создаёт и управляет объектом типа ArrayList.
    Реализовал конструктор по умолчанию и метод "add", но такой подход утяжеляет код.

    Выглядит примерно так:
    Код:
    class ListManagerTest {

        public static void main(String[] args) {
            
            Item item1 = new Item("Item1");
            Item item2 = new Item("Item2");

            ListManager list = new ListManager();

            list.add(item1);
            list.add(item2);
            

        }

    }

    class ListManager {

        public ListManager() {

        }

        public void add(Item item) {

            list.add(item);

        }

        private ArrayList<Item> list = new ArrayList<Item>();

    }

    class Item {

        public Item(String aName) {

            name = aName;

        }

        private String name = "";

    }

    А что, если в список надо добавить несколько десятков объектов?

    Вот и хотел узнать, есть ли в джаве возможность создавать конструкторы класса с переменным кол-вом аргументов? Что-то вроде:

    Код:
            ListManager list = new ListManager(
                    item1, item2, item3, ..., item42);

    Всё это усложняется тем, что добавлять надо объекты своего собственного класса, а не стандартного.
  • Программирование :: Программирование 1С
  • При загрузке 1с 7.7-025 идет приветственное окошко в котором показаны загрузки модулей, затем база открывается и сразу закрывается без предупреждения ЧТО ДЕЛАТЬ???? Остальные абсолютно такие и на той же машине работают нормально. Баз всего 5 - одна головная которая не работает а четыре для филиалов и все работают, хотя 100% идентичность.
  • С 15 декабря UCS увеличила процент по Визе до 1,69%.
    В данный момент 1,6% где это можно поменять?
    Спасибо большое?
    1С Бухгалтерия
  • Доброго дня! Нужна помощь. Мои пользователи каким-то непонятным для меня способом загнали панель инструментов Стандартная за границы окна ("Мышка дернулась"). Я нигде не смогла заметить даже кончика, чтобы подцепить ее и вытянуть. Подскажите, где хранятся координаты этой панели и как их изменить вручную.
  • Всем привет!
    Собираюсь изучать 1С 7.7, говорят хорошая штука. Так вот, взял попросил установочный в универе, мне вроде как скачали то что надо. Устанавливаю дома, а он запрашивает установочный конфигуратора. Вот отсюда мой вопрос: этот конфигуратор, он разве не идет вместе с установочным пакетом??? Если нет, то где его достать? (Если у вас есть какие нибудь ссылки по установке было бы классно, ну так для полного счастья). Спасибо за внимание!   
  • Здравствуйте. (Sel вам персональный привет)
    1с 8.0. УТ.Режим серверный
    Подскажите, наверняка кто-то из вас, программистов 1с, делает «срез» базы . Поделитесь опытом.
    Как выделаете - так:

        1.  Вы формируете остатки в той же базе на определенную дату
        2.  Удаляете старые документы в той же базе
       А. сначала установка пометки на удаление, потом удаление стандартными средствами
       Б.  или может без пометки на удаление, а используете непосредственное удаление

    или, может, вы делаете «срез» вот так:

       1.  Вы формируете остатки в той же базе на определенную дату
       2.   В новую базу переносите документы, справочники, независимые регистры накопления …
  • Программирование :: Программирование 1С :: 1С 7.x
  • Народ, помогите ПРАВИЛЬНО вызвать диалог выбора элемента справочника (Метод "Выбрать()/Choose()").
    Подключаюсь к 1С методом динамического  связывания.
    Окно авторизации показывается активным (поверх окна вызывающего приложения), а диалоговое окно неактивно (под окном вызывающего), что не есть ГУД.
    Если подключаться к 1С без вызова диалога авторизации (прописать нужные параметры), то в первый раз диалог отображается правильно, а все остальные вызовы проходят как и в первом случае (в неактивном окне).
  • Доброго дня! Сегодня столкнулась с такой странностью. Не могу понять, то ли я бестолковая, то ли это глюк какой. Использовала функцию Уровень() в двух процедурах и получила разные результаты на обних и тех же элементах. Первая процедура ПриВыбореРодителя, вторая ПриСменеИерархии. Справочник двухуровневый. Первый уровень-одни папки, второй элементы. ПриВыбореРодителя на уровне, где папки функция Уровень() вернула 2, а там где элементы вернула 1. Если же отменить иерархию, а потом ее востановить, на уровне где папки возвращается 1, а там где элементы - 2. Т.е. наоборот.  Обработку я конечно написала исходя из факта, но все же любопытно, что за лажа.
  • Помогите, пожалуйста, создать внешнюю обработку правильного удаления выбранной группы справочника Номенклатуры, если есть ссылки на удаляемые объекты - то их тоже удалить, и у них тоже......

    Комплексная конфигурация "Бухгалтерия+Торговля+Склад+Зарплата+Кадры", редакция 4.5
    Данные в .dbf


    У меня пока что не удается рекурсия и помечает только часть:


    Код:

    //ВыбНоменклатура - удаляеммая группа
    Процедура СсылкиНаСсылки(Удал1, н1) Далее

    //*******************************************
    Процедура Сформировать() //начало

    СсылкиНаСсылки(ВыбНоменклатура, 1);

    Сообщить("Готово");
    КонецПроцедуры
     

    //н1 - счетчик
    //Удал1 = Удаляемый объект
    Процедура СсылкиНаСсылки(Удал1, н1)


    //Помечает на удаление объекты выбранного справочника Номенклатуры и передает в СпНом
    СпНом = СоздатьОбъект("СписокЗначений");
    СпрНом = СоздатьОбъект("Справочник.Номенклатура");

    СпрНом.ВыбратьЭлементы();
    Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
    Если СпрНом.ТекущийЭлемент() = Удал1 Тогда
    СпрНом.Удалить(0);
        СпНом.ДобавитьЗначение(СпрНом.ТекущийЭлемент());
    КонецЕсли;
    КонецЦикла;

    //Удаление выб. Номенклатуры, если есть ссылки на них - не удаляются, а ссылки в ТЗ
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    УдалитьОбъекты (СпНом, 1, ТЗ);



    //ссылки на справочники и документы помечаем на удаление
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл

    Объект = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,"Ссылка");
        ТипОбъекта = ТипЗначенияСтр(Объект);
        ВидОбъекта = Объект.Вид();
        ВремОбъект = СоздатьОбъект(ТипОбъекта+"."+ВидОбъекта);
        Если ТипОбъекта = "Справочник" Тогда
            Элем=ВремОбъект.НайтиЭлемент(Объект);
            ВремОбъект.Удалить(0); //помечаем на удаление
    н1=н1+1;
    СсылкиНаСсылки(ВремОбъект, 1);
        ИначеЕсли ТипОбъекта = "Документ" Тогда
            Докум=ВремОбъект.НайтиДокумент(Объект);
            ВремОбъект.Удалить(0);
    н1=н1+1;
    СсылкиНаСсылки(ВремОбъект, 1);
    КонецЕсли;
    Сообщить(н1);
    КонецЦикла;

    Сообщить("КонецОбхода");
    КонецПроцедуры


  • У объекта типа "таблица" есть метод опции()

    Код:
    Таб = СоздатьОбъект("Таблица");
    ...
    Таб.Опции();

    Один из параметров:
    <ИмяОпцийПечати> - строковый идентификатор набора опций печати (необязателен, умолчание - пустая строка, в этом случае используются системные опции печати по умолчанию).

    Как они программно задаются, эти опции печати? Если  сдобрите ответ примером, буду очень благодарен.

  • Программирование :: Программирование 1С :: 1С 8.x
  • Есть программка ЗУП. В ней есть справочники физических лиц и сотрудников в организации. Есть справочник физических лиц и сотрудников организации и в бухгалтерии. Естественно, табельные номера в этих двух разных программках не совпадают. И если я буду делать выгрузку из ЗУПа в бухгалтерию, то будет раздвоение сотрудников. Я хочу ручками причесать бухгалтерию, чтобы табельные номера совпадали, но не получится ли потери данных, ведь в бухгалтерии на табельные  номера этих сотрудников уже занесли какие то данные????
  • Программирование :: Авторское ПО
  • Цитата: Предыстория
    Один мой знакомый попросил написать маленькую программку, которая бы размещалась на флешке и при открытии ее, копировала некоторые файлы на эту флешку. За один субботний вечер была написана эта программка.
    На все мои вопросы, "зачем тебе это надо" и "помогла ли тебе, в твоих шпионских делах, программа" он упорно молчит. :)

    Программа предназначена для скрытого копирования файлов и поддержания их в синхронизированном состоянии с оригиналом. Запуск программы обеспечивается "autorun.inf" файлом размешенном в корневой директории сменного накопителя или подключаемого жесткого диска. Таким образом, если в системе отключена функция "AutoRun" ([HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]"NoDriveTypeAutoRun"=dword:000000ff), запуск программы не будет выполняться.

    Код: ("Возможности")
    #
    Файл конфигурации должен находиться в одной директории с программой и
    # иметь название 'duplicate.lst'. Хорошей идеей использовать в качестве
    # файла конфигурации этот файл, продолжив его списком копируемых файлов и
    # сканируемых директорий. Все строки в файле 'duplicate.lst' начинающиеся
    # с символа '#' являются комментариями и игнорируются при разборе файла
    # конфигурации.
    #
    # Список параметров передаваемых через командную строку:
    # --enable-log         - записывать информацию о ходе своей работы.
    #                        Log-файл создается в одной директории с
    #                        программой под именем 'duplicate.log'.
    # --disable-explorer   - не запускать 'explorer'. В основном используется
    #                        для отладки приложения через отладчик.
    #
    # Список поддерживаемых модификаторов:
    # c= - копировать
    # C= - копировать рекурсивно
    # l= - отправить в log список файлов
    # L= - отправить в log рекурсивный список файлов
    # d= - отправить в log список дисков установленных в системе
    # если модификатора нет то подразумевается 'c='.
    #
    # Так же в конце имени файла можно использовать два символа подстановки:
    # * - соответствует любой строке символов а так же пустой строке
    # ? - соответствует любому одиночному символу
    #
    # Примеры:
    # d:\dir\*.doc         - копировать все документы Word
    # d:\dir2\file?.tx?    - копировать файлы по шаблону (например 'file2.txt', 'file_.tx9')
    # d:\dir\file.txt      - копировать файл 'file.txt'
    # c=d:\dir\file.txt    - копировать файл 'file.txt'
    # C=c:\dir             - копировать рекурсивно каталог 'dir'
    # C=c:\dir\            - копировать рекурсивно каталог 'dir'
    # l=c:\катал1          - отправить в log содержимое каталога 'катал1'
    # l=c:\катал1\         - отправить в log содержимое каталога 'катал1'
    # L=c:\катал1          - отправить в log содержимое каталога 'катал1' и его подкаталогов
    # d=                   - отправить в log список дисков установленных в системе
    #

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

    Утилита представляет собой icq-подобную программу, где в верхнем окне пишутся команды, а в нижнем - читаются ответы от ридера. Работа идёт через функцию SCSendCommand, передающую в ридер APDU-команды и возвращающую результаты. Программа тестировалась на ридерах OmniKey 21/51 (теоретически, должна работать с любым контактным ридером), и, теоретически, будет работать с любой картой, поддерживающей команды APDU стандарта ISO 7816.


    Требования.

    Платформа - Win32, наличие в системе winscard.dll (по дефолту предустанавливается в system32), наличие контактного ридера смарткарт.


    Порядок использования.
    1) Вставляем карту
    2) щёлкаем подключиться - программа выдаст ATR (answer-to-reset) карты
    3) набираем команду в виде XXXXXXXX или XX XX XX XX и нажимаем enter - программа вернёт ответ
    4) можно набрать или вставить сразу несколько команд, выделить и нажать на выполнить - все команды будут выполнены последовательно
    5) нажимаем отключиться
    6) вытаскиваем карту.

    Примечания.

    Впервые прога засветилась здесь. обращений на почту хватало, мне надоело, решил опубликовать у нас. В архиве лежат экзешник, исходники для D7 и модуль-обёртка для WinSCard.dll.

  • Операционные системы :: Windows
  • Никто случаем не знает в 7-ке штатного средства, предоставляющего эмуляцию VT100 в какой-нибудь консоли?

    В обычном cmd и в PowerShell консолях управляющие esc-последовательности не работают.
    Режима эмуляции DOS нет, поэтому старый ANSI.SYS не включить.
    Hyperterminal начиная с Vista в системе отсутствует.

    Или считается, что в XXI веке алфавитно-цифровые терминалы никому не нужны?
  • В Home версиях 7-ки оснастка управления локальными пользователями и группами запрещена к использованию. В свойствах пользователя нет опций для управления группами.

    Как (через консоль или через какие-нибудь программные интерфейсы) всё-таки включить юзера в некоторую группу?
  • (Путаюсь в терминах , описывающих связывание с длл, поэтому по-простому вопрос задам:)

    экзешник использует A.dll, в программе указывается

    Код:
     #pragma comment(lib,"A.lib")

    но потом, при запуске, экзешник ищет длл сначала около себя, потом в system32 (в ведь если найдёт - цепляет оттуда...)

    А как указать путь (хотя бы относительный) к длл, не используя LoadLibrary/ GetProcAddress  ?

    то есть, к примеру, жёстко из папки D:\1\DDL\
  • Операционные системы :: Unix и другие
  • Подскажите, как можно определить глубину рекурсии символических связей для ос.
  • Направления программирования :: Drivers
  • Доброго всем времени суток...
    Появилась идейка связать компьютер и внешнее устройство (PIC18F4550) через USB шину (metod BUFFERED, тип передачи изохорный). От системы (PIC18F4550) требуется, для начала, получить (от хоста) и передать хосту 2 слова данных. С внешним устройством проблем нет (программой), а на компьютер есть.
    Драйверами начал заниматься где-то около месяца назад, прочитал умные книги : Агуров, Уолтер Они, и теперь в голове каша полная.
    Взял пример из DDK isoUSB за основу (правильно ли это?). На мой взгляд, там слишком много включено ненужных (необязательных) функций драйвера (так ли это?).
    Я уяснил, что есть обязательные функции: DriverEntry, DriverUnload, AddDevice.
    Рабочие процедуры регистрируются:

        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsoUsb_DispatchDevCtrl;
        DriverObject->MajorFunction[IRP_MJ_POWER]          = IsoUsb_DispatchPower;
        DriverObject->MajorFunction[IRP_MJ_PNP]            = IsoUsb_DispatchPnP;
        DriverObject->MajorFunction[IRP_MJ_CREATE]         = IsoUsb_DispatchCreate;
        DriverObject->MajorFunction[IRP_MJ_CLOSE]          = IsoUsb_DispatchClose;
        DriverObject->MajorFunction[IRP_MJ_CLEANUP]        = IsoUsb_DispatchClean;
        DriverObject->MajorFunction[IRP_MJ_READ]           =
        DriverObject->MajorFunction[IRP_MJ_WRITE]          = IsoUsb_DispatchReadWrite;
        DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = IsoUsb_DispatchSysCtrl;
        DriverObject->DriverUnload                         = IsoUsb_DriverUnload;
        DriverObject->DriverExtension->AddDevice           = (PDRIVER_ADD_DEVICE) IsoUsb_AddDevice;

    Скажите, все ли эти процедуры нужно включать в драйвер для моей будущей системы, если мне нужно просто передавать и принимать без  отслеживания и контроля транзакций, правильно ли будет ограничиться следующим набором рабочих процедур:

        DriverObject->MajorFunction[IRP_MJ_CREATE]         = IsoUsb_DispatchCreate;
        DriverObject->MajorFunction[IRP_MJ_CLOSE]          = IsoUsb_DispatchClose;
        DriverObject->MajorFunction[IRP_MJ_READ]           = IsoUsb_DispatchReadWrite;
        DriverObject->MajorFunction[IRP_MJ_WRITE]          = IsoUsb_DispatchReadWrite;
        DriverObject->DriverUnload                         = IsoUsb_DriverUnload;
        DriverObject->DriverExtension->AddDevice           = (PDRIVER_ADD_DEVICE) IsoUsb_AddDevice;

    Помогите "разложить все по полочкам".
    Конкретные вопросы будут потом.
    СПАСИБО.
  • Дали задание написать "простейший" usb драйвер. Без прерываний, чтобы загружался, отображался в реестре, затем выгружался и чистил за собой следы.  Начал разбираться...

    Сначала сделал просто тестовый драйвер, чтобы понять принцип билдинга DDK и дальнейшего запуска, следуя изложенному примеру http://habrahabr.ru/blogs/system_programming/40466/

    Теперь вот переписал все  из Агурова по написанию USB.

    Код:
      // shchDriver.c
       
        #include <ntddk.h>
     
       NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
       {
       
       
         NTSTATUS ntStatus = STATUS_SUCCESS;
    // Основные обработчики драйвера
            DriverObject->MajorFunction[IRP_MJ_CREATE]=OnCreate;
            DriverObject->MajorFunction[IRP_MJ_CLOSE ]=OnClose;
            DriverObject->MajorFunction[IRP_MJ_READ ] =OnDeviceRead;
            DriverObject->MajorFunction[IRP_MJ_PNP ] =OnDispatchPnp;
            DriverObject->MajorFunction[IRP_MJ_POWER ] =OnDispatchPower;
            DriverObject->DriverUnload  = OnUnload;
            DriverObject->DriverExtension->AddDevice=onAddDevice;
         
         return ntStatus
         //DbgPrint("Hello world!\n");
         //return STATUS_SUCCESS;
        }
       NTSTATUS OnAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
       {
            NTSTATUS ntStatus = STATUS_SUCCESS;
            PDEVICE_OBJECT deviceObject = NULL;
            PDEVICE_EXTENSION pdx;
            WCHAR NameBuffer[] = L"\\Device\\" DEVICE_NAME_STRING;
            WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;
            UNICODE_STRING uniNameString, uniDOSString;
            // Создание буферов для имен
             RtlInitUnicodeString(&uniNameString, NameBuffer);
             RtlInitUnicodeString(&uniDOSString , DOSNameBuffer);
             DbgPrint("UniName=%s DosName=%s", uniDOSString, uniNameString);
             //Инициализация объекта драйвера
                ntStatus = IoCreateDevice(DriverObject, sizeof (DEVICE_EXTENSION), &uniNameString, FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject );
            // Создание символьного имени драйвера
            ntStatus = IoCreateSymbolicLink(&uniDOSString, &uniNameString);
            // Инициализация блока данных объекта устройства
                DbgPrint("Init device extension");
                pdx = (PDEVICE_EXTENSION) (deviceObject->DeviceExtension);
                pdx->OpenHandles == 0;
               
            // Драйвер будет использовать прямой ввод/вывод для запросов
            // чтения и записи
            deviceObject->Flags |= DO_DIRECT_IO;   
            // Сохраняем ссылку на драйвер нижнего уровня. Ему мы будем
            // пересылать запросы на ввод/вывод
            pdx->StackDeviceObject = IoAttachDeviceToDeviceStack(deviceObject, PhysicalDeviceObject);
            return ntStatus;
       }
               typedef struct _DEVICE_EXTENSION
            {
            //Объект устройства в стеке IRP
            PDEVICE_OBJECT StackDeviceObject;
            // Число устройств для этого драйвера
            ULONG OpenHandles;
            // TRUE, если устройство стартовано
            BOOLEAN Started;
            } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
               NTSTATUS OnCreate(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
               {
                Irp->IoStatus.Information = 0;
                ntStatus = Irp->IoStatus.Status;
                IoCompleteRequest(Irp, IO_NO_INCREMENT);
                return ntStatus;
               }
                NTSTATUS OnClose(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
                {
                NTSTATUS ntStatus;
                PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
                // счетчик открытых устройств
                pdx->OpenHandles--;
                Irp->IoStatus.Status = STATUS_SUCCESS;
                Irp->IoStatus.Information = 0;
                ntStatus = Irp->IoStatus.Status;
                IoCompleteRequest (Irp, IO_NO_INCREMENT);
                return ntStatus;
                }
      NTSTATUS OnDispatchPower(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
      {
            PIO_STACK_LOCATION irpStack, nextStack;
            PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
            NTSTATUS ntStatus;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = 0;
            irpStack = IoGetCurrentIrpStackLocation(Irp);
            nextStack = IoGetNextIrpStackLocation(Irp);
            RtlCopyMemory(nextStack, irpStack, sizeof(IO_STACK_LOCATION));
            PoStartNextPowerIrp(Irp);
            ntStatus = PoCallDriver(pdx->StackDeviceObject, Irp);
            if (ntStatus == STATUS_PENDING)
            {
            IoMarkIrpPending(Irp);
            }
            return ntStatus;
      }
      NTSTATUS OnDispatchPnp(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
      {
            PIO_STACK_LOCATION irpStack;
            PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
            ULONG fcn;
            NTSTATUS ntStatus;
            /* Получаем текущую позицию в стеке драйверов */
            irpStack = IoGetCurrentIrpStackLocation (Irp);
            /* Номер функции */
            fcn = irpStack->MinorFunction;
                        switch (fcn)
        {
                /* Обработка старта устройства */
                case IRP_MN_START_DEVICE:
                {
                ntStatus = OnStartDevice(fdo);
                if (ntStatus == STATUS_SUCCESS)
                    {
                    pdx->Started = TRUE;
                    }
              break;
                }
           
            case IRP_MN_STOP_DEVICE:
            {
            // Сначала передаем запрос драйверу ниже по стеку
            IoSkipCurrentIrpStackLocation(Irp);
            IoCallDriver(pdx->StackDeviceObject, Irp);
            // отрабатьюаем остановку нашего устройства
            ntStatus = OnStopDevice(fdo);
            break;
            }
            /* Удаление устройства из системы */
            case IRP MN REMOVE DEVICE:
            {
            ntStatus = OnRemoveDevice(fdo,Irp);
            break;
            }
            // Все остальные запросы передаем драйверу дальше по стеку
                default:
                {
                IoSkipCurrent rpStackLocation(Irp);
                ntStatus = IoCallDriver(pdx->StackDeviceObject, Irp);
                }
        }
            return ntStatus;
       
      }
    ///////////////////////////////////////////////////////////
    NTSTATUS DoCallUSBD(IN PDEVICE_OBJECT fdo,IN PURB Urb)
    {
    NTSTATUS ntStatus, status = STATUS_SUCCESS;
    PDEVICE_EXTENSION pdx;
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION nextStack;
    pdx = fdo->DeviceExtension;
    // объект синхронизации
    KeInitializeEvent(&event, NotificationEvent, FALSE);
    irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->StackDeviceObject,NULL, 0, NULL, 0,TRUE, /* INTERNAL */ &event, &ioStatus );
    // получение следующей позиции в стеке драйверов
    nextStack = IoGetNextIrpStackLocation(irp);
    // Формирование параметров для вызова
    nextStack->Parameters.Others.Argument1 = Urb;
    // Вызов
    ntStatus = IoCallDriver(pdx->StackDeviceObject, irp);
    // Если запрос еще выполняется...
    if (ntStatus == STATUS_PENDING)
    {
    status = KeWaitForSingleObject(&event,Suspended, KernelMode, FALSE, NULL);
    } else {
    ioStatus.Status = ntStatus;
    }
    // Обработка результата запроса
    ntStatus = ioStatus.Status;
    if (NT_SUCCESS(ntStatus))
    {
    if (!(USBD_SUCCESS(Urb->UrbHeader.Status)))
    ntStatus = STATUS_UNSUCCESSFUL;
    }
    return ntStatus;
    }
    NTSTATUS OnstartDevice(IN PDEVICE_OBJECT fdo)
    {
    PDEVICE_EXTENSI0N pcx;
    NTSTATUS ntStatus;
    PUSB_DEVICE_DESCRIPTOR deviceDescriptor = NULL;
    PURB urb;
    ULONG size;
    pdx = fdo->DeviceExtension;
    urb = ExAllocatePool( NonPagedPool, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
    size = sizeof(USB_DEVICE_DESCRIPTOR);
    deviceDescriptor = ExAllocatePool(NonPagedPool, size);
    UsbBuildGetDescriptorRequest(urb,(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_DEVICE_DESCRIPTOR_TYPE,0,0,deviceDescriptor,NULL,size,NULL
    );
    // Передача запроса на выполнение
    ntStatus = DoCallUSBD(fdo, urb);
            // Отображение дескриптора
            if (NT SUCCESS(ntStatus)) {
                DbgPrint("Device Descriptor: ");
                DbgPrint("bLength %d ",deviceDescriptor->bLength);
                DbgPrint("bDescriptorType  0x%x",deviceDescriptor->bDescriptorType);
                DbgPrint("bcdUSB   0x%x",deviceDescriptor->bcdUSB);
                DbgPrint("bDeviceClass    0x%x",deviceDescriptor->bDeviceClass);
                DbgPrint("bDeviceSubClass    0x%x",deviceDescriptor->bDeviceSubClass); 
                DbgPrint("bDeviceProtocol     0x%x",deviceDescriptor->bDeviceProtocol);
                DbgPrint("bMaxPacketSizeO     0x%x",deviceDescriptor->bMaxPacketSizeO);
                DbgPrint("idVendor     0x%x",deviceDescriptor->idVendor); 
                DbgPrint("idProduct     0x%x",deviceDescriptor->idProduct);   
                DbgPrint("bcdDevice     0x%x",deviceDescriptor->bcdDevice);
                DbgPrint("iManufacturer      0x%x",deviceDescriptor->iManufacturer);   
                DbgPrint("iProduct      0x%x",deviceDescriptor->iProduct);
                DbgPrint("iSerialNumber       0x%x",deviceDescriptor->iSerialNumber); ; 
               
            }
            // Освободить занятую память
            ExFreePool(deviceDescriptor);
            ExFreePool(urb);
            if (NT_SUCCESS(ntStatus)) {
            // Конфигурируем устройство
            ntStatus = OnConfigureDevice(fdo);
            }
            return ntStatus;
            }
            NTSTATUS OnConfigureDevice(IN PDEVICE_OBJECT fdo )
            {
            PDEVICE_EXTENSION pdx;
            NTSTATUS ntStatus;
            PURB urb = NULL;
            ULONG size;
            PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor = NULL;
            UCHAR alternateSetting, MyInterfaceNumber;
            PUSBD_INTERFACE_INFORMATION interfaceObject;
            USBD_INTERFACE_LIST_ENTRY interfaceList;
            pdx = fdo->DeviceExtension;
                // Память для URB
                urb = ExAllocatePool(NonPagedPool,sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
                // Получить только дескриптор конфигурации
                size = sizeof(USB_CONFIGURATION_DESCRIPTOR) + 16;
                configurationDescriptor = ExAllocatePool(NonPagedPool, size);
                UsbBuildGetDescriptorRequest(urb,(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),USB_CONFIGURATION_DESCRIPTOR_TYPE,0,0, configurationDescriptor,
                NULL,sizeof (USB_CONFIGURATION_DESCRIPTOR) ,NULL);
                ntStatus = DoCallUSBD(fdo, urb);
                // Определение нужного размера буфера
                size = configurationDescriptor->wTotalLength + 16;
                // Освободить старый буфер и отвести новый, нужного размера
                ExFreePool(configurationDescriptor);
                configurationDescriptor = NULL;
                configurationDescriptor = ExAllocatePool(NonPagedPool, size);
                // Получение полного дескриптора конфигурации
                UsbBuildGetDescriptorRequest(urb,(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),USB_CONFIGURATION_DESCRIPTORJTYPE,
                0, 0, configurationDescriptor, NULL, size, NULL);
                ntStatus = DoCallUSBD(fdo, urb);
                // Получение конфигурации
                interfaceList.InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(
                ConfigurationDescriptor,
                ConfigurationDescriptor,
                -1, -1, -1, -1, -1
                );
                // Создание запроса для получения конфигурации
                urb = USBD_CreateConfigurationRequestEx(
                   ConfigurationDescriptor, &interfaceList
                );
                // Получение указателя на буфер описания интерфейса
                interfaceObject = (PUSBD_INTERFACE_INFORMATION)
                (&(urb->UrbSelectConfiguration.Interface));
                // Конфигурирование конечных точек интерфейса
                for (j=0; j<interfaceList[0].InterfaceDescriptor->bNumEndpoints; j++)
                {
                    PUSBD_PIPE_INFORMATION pipe;
                    pipe = &interfaceObject->Pipes[j];
                    pipe->MaximumTransferSize = 1024; // установить при необходимости
                    DbgPrint("PipeType 0x%x\n", pipe->PipeType);
                    DbgPrint("EndpointAddress 0x%x\n", pipe ->EndpointAddress);
                    DbgPrint("MaxPacketSize 0x%x\n", pipe ->MaximumPacketSize);
                    DbgPrint("Interval 0x%x\n", pipe ->Interval);
                    DbgPrint("Handle 0x%x\n", pipe ->PipeHandle);
                    DbgPrint ("MaximumTransferSize Ox%x\n", pipe ->MaximumTransferSize) ;
                )
                ntStatus = DoCallUSBD(fdo, urb) ;
                ExFreePool (urb) ;
                ExFreePool (configurationDescriptor) ;
                return ntStatus;
                }
            NTSTATUS OnstopDevice(IN PDEVICE_OBJECT fdo)
                {
                PDEVICE_EXTENSION pdx;
                NTSTATUS ntStatus - STATUS_SUCCESS;
                PURB urb;
                ULONG size;
                pdx = fdo->DeviceExtension;
                size= sizeof(struct _URB_SELECT_CONFIGURATION);
                urb = ExAllocatePool(NonPagedPool, size);
                if (urb)
                {
                NTSTATUS status;
                UsbBuildSelectConfigurationRequest(urb, (USHORT) size, NULL);
                status = DoCallUSBD(fdo, urb);
                ExFreePool(urb);
                } else {
                ntStatus = STATUS_NO_MEMORY;
                }
                return ntStatus;
                }
                    NTSTATUS OnRemoveDevice(IN PDEVICE_OBJECT fdo, IN PIRP Irp )
                    {
                    NTSTATUS ntStatus;
                    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
                    ULONG i;
                    WCHAR NameBuffer [] = L"\\Device\\" DEVICE_NAME_STRING;
                    WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE__NAME_STRING;
                    UNICODE_STRING uniNameString, uniDOSString;
                    // Создание буферов для имен
                    RtlInitUnicodeString(SuniNameString, NameBuffer);
                    RtlInitUnicodeString(&uniDOSString , DOSNameBuffer);
                    // Удаление символьного имени драйвера
                    ntStatus = IoDeleteSymbolicLink(&uniNameString);
                    IoDetachDevice(pdx->StackDeviceObject);
                    IoDeleteDevice(fdo);
                    IoSkipCurrentIrpStackLocation(Irp) ;
                    ntStatus = IoCallDriver(pdx->StackDeviceObject, Irp);
                    return ntStatus;
                    }
                NTSTATUS OnDeviceRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
                {
                   
                NTSTATUS ntStatus = STATUS_SUCCESS;
                PUSBD_PIPE_INFORMATION pipelnfo = NULL,
                USBD_PIPE_HANDLE pipeHandle = NULL,
                PURB urb = NULL,
                ULONG urbSize = 0;
                pipelnfo = ... ; // одна из конечных точек
                pipeHandle = pipeInfo->PipeHandle;
                urbSize = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
                urb = ExAllocatePool(NonPagedPool,urbSize);
                transferFlags = USBD_SHORT_TRANSFER_OK;
                if (USB_ENDPOINT_DIRECTION_IN(pipeInfo->EndpointAddress))
                  transferFlags |= USBD_TRANSFER_DIRECTION_IN;
                // Формирование запроса
                UsbBuildlnterruptOrBulkTransferRequest(urb,(USHORT) urbSize, pipeHandle, NULL,Irp->MdlAddress,bufferLength, transferFlags, NULL );
                // Выполнение запроса
                ntStatus = DoCallUSBD(fdo, urb);
                if (NT_SUCCESS(ntStatus))
                {
                Irp->IoStatus.Information =
                urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
                }
                // Освободить память
                ExFreePool(urb);
                // Вернуть результат запроса
                return ntStatus;
                }


    Но уверен, что много чего не хватает, и, наверное, есть много ошибок. При билде выдал много всего. Перечитал много всего, но везде пишут про Jungo и Driver Studio, но это, сами понимаете, мне не подходит. Думал, найду чтоибудь в примерах ddk, но там по usb оказались разные ветвленые вьюверы и что-то другое. Мне нужен пустой голый шаблон, по сути.

    Надеюсь, сможете мне дать нужный вектор, где что посмотреть и поправить.

             
  • Направления программирования :: Web
  • Доброго всем вечера! Подскажите, пожалуйста, как создать тень вокруг таблицы.. При помощи css.. Что-то подобное, как здесь: http://css-school.ru/page/5/.. Очень нужно..  :confused:
  • Практические разделы :: Базы данных
  • После установки db2 на компьютер (os win serv 2003, db2 v9.5, 1C 8.1.15) начала заметно ухудшаться работа 1С, очень долго обрабатываются проводки и выборки контрагентов. Посмотрел в событиях Приложений, сыпятся предупреждения "ADM4000W  Произошла ситуация переполнения кэша каталога.  Это не ошибка, однако это значит, что кэш каталога превысил сконфигурированный максимальный размер. Если эта ситуация продолжает возникать, возможно, надо настроить параметр конфигурации базы данных CATALOGCACHE_SZ."
    Что необходимо для нормализации работы db2?
  • Практические разделы :: Железо
  • Вот тема, в которой можно обсудить внутреннее устройство и методы диагностирования/самодиагностирования, примененные в машинах VAX
  • Здравствуйте. Проблема в том, что в один прекрасный момент компьютер не включился. Просто стал при включении самопроизвольно перезагружаться до бесконечности. Помогла только переустановка Винды. Месяца 4 все работало замечательно. Недавно ситуация повторилась. Попыталась зайти в безопасном  режиме, при нажатии F8 ничего не произошло. Снова переустановила Винду, но на диск Д, а потом и старая загрузилась с диска С, все снова в порядке.....
    Подскажите, пожалуйста, что может быть такое?  :shuffle:
  • Практические разделы :: Программы
  • Потребовался тут бесплатный почтовый ящик, взял первое что подвернулось  :) rambler, зарегил.
    Имеем: http доступ работает, а при попытке воспользоваться Outlook'ом вылетает ошибка 0x800CCC0F при обращении к серваку,
    попытался найти в инете чтобы это значило, но ничего путного не нашел.
    Кто знает что это и чем лечится. Заранее спасибо за ответ.
  • Как в OO подключить словари?

    Скачал русский, установил его через расширение, но он упорно не подчеркивает ошибки и не находит их при проверке.

  • Собственно сабж, давно мечтаю соорудить пару загрузочных дисков собственого производства.
    Как это сделать?
  • Народ, кто-нибудь пользовался LogMeIn? Программа для удаленного доступа. У меня на работе специалистов нет, зато есть пара вопросов по программе. А?

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное