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

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


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 123.  6 ноября 2011 г.

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

Сегодня предлагаем вам фрагмент второй части статьи «Hello World! в embedded-исполнении» и подборку свежих тем нашего форума.




Пополнение «Книжной полки разработчика систем со встроенными микропроцессорами». Следующие книги и статьи рекомендуются к прочтению:





Приятного чтения!




Оглавление


Начало: Часть 1.



Подготовка инфраструктуры


Начнем с того, что определим место для размещения файлов нашего будущего проекта. Им станет директория Blinker; создадим ее там, где вы обычно группируете свои проекты. В дальнейшем я буду ссылаться на нее как на корневую директорию проекта.

После создания директории приступим к ее заполнению.


Корневая директория проекта


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

При разработке языка программирования Ruby был провозглашен «принцип наименьшего удивления»: тот, кто изучает язык или программирует на нем, не должен испытывать недоумения по поводу его концепций, синтаксиса, идиом и т.д. Каждый раз, встречая ранее незнакомую конструкцию, у человека должно быть ощущение, что сам он сделал бы точно так же. Не стану дискутировать на тему, насколько этот благой принцип был соблюден в самом Ruby, но идея как таковая представляется весьма здравой. Постараемся и мы работать таким образом, чтобы любой, кто случайно или намеренно забрел в директорию нашего проекта, не был вынужден ломать голову над тем, куда он, собственно, попал и что здесь делают все эти непонятные файлы.

Следуя принципу наименьшего удивления, создадим в корневой директории проекта файл README.txt, в котором кратко опишем назначение и цель проекта, а также имена и назначение файлов и поддиректорий. Усилий и времени это отнимет минимум, а вот пользу таких файлов трудно переоценить (при условии, конечно, что они отвечают на наиболее вероятные вопросы потенциального читателя, а не напускают лишнего тумана). Само собой, содержимое файла следует время от времени пересматривать, чтобы оно не потеряло актуальность в ходе развития проекта.

Завершив литературную часть, начнем создавать собственно структуру директорий. Поскольку наш проект включает в себя как аппаратную, так и программную части, зарезервируем для них две поддиректории с очевидными (не забываем про принцип наименьшего удивления!) именами: Hardware и Software.


Поддиректория Hardware


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

Здесь же мы в свое время разместим модели, позволяющие отладить виртуальные устройства еще до того, как они будут изготовлены. При должном умении удивительно много можно сделать без паяльника.

В данный момент нам еще особенно нечем заполнить эту поддиректорию; пока ограничимся наброском файла README.txt, поясняющего назначение поддиректории.


Поддиректория Software


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


...


Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».

  • Программирование :: Неотложка
  • Добрый день.
    Пытаюсь разобраться с Vesa BIOS,но на данный момент даже самые простые действия не получаются,а погуглив ничего толкового не нашел.Надеюсь на подсказки или посылания на полезную информацию,которая поможет мне во всем разобраться.
    Дело такое.
    1)Нужно разместить буфер длиной 256 байт.Этот буфер должен испоьзоваться Vesa BIOS для возврата информации о видео среде.
    2)Нужно вызвать функцию 00h из Vesa BIOS.
    3)Создать новый буфер и вызвать из Vesa BIOS функцию 01h,чтобы получить информацию о поддерживаемых видеорежимах. Используя VideoModePtr,нужно вызывать эту функцию до тех пор,пока не будет найден походящий видео режим.
    Ну и вот по порядку.
    Код:
    #include <conio.h>
    #include <stdio.h>

    int main() {

    char *buf[256];     // 1) Размещаем буфер(этого не делал 100 лет,но вроде бы так это делается)
    unsigned char state1,state2; // переменные для определения результата выполнения 00h

     asm {
           mov AH,0x4F; // 2) Вызов функции 00h. Вход: AH = 4Fh
           mov AL,0x00; // AL = 00h
           ES:DI,buf;     // ES:DI - указатель на буффер (вот тут не уверен,что правильно сделал)
           int 0x10;
           mov state1,AL;
           mov state2,AH;

           }
     if (state1 == 0x4F) // Если AL == 4Fh
     printf("Function is supported\n"); // функция поддерживается
     else
     printf("Function is not supported\n"); // В противном случае - функция не поддерживается

     if (state2 == 0x00) // Если AH == 00h
     printf("Function call was sucsessfull\n"); // Вызов был успешным
     else
     printf("Error in function call\n"); //В противном случае - имеет место ошибка
    getch();
    return 0;
    }
    При попытке компилирования ругается на строку ES:DI,buf.Не могу понять как его правильно задать.
    По третьему вопросу:
    скажем - на входе должно быть CX = номер режима SuperVGA,который должен равняться одному из тех,что были возвращены функцией 0.
    Структура информационного блока функции 0 имеет следующий вид
    Код:
    struct VESAINfo
    {
      char sign[4]; // VESA signature
      unsigned int ver; // VESA BIOS version
      char far *OEM; //Original Equipment Manufacturer
      long cap;
      int far* modeList; //supported modes
      int totalMemory; //int 64K blocks
    }
    Вопросчто здесь является тем самым номером режима SuperVGA,который надо подать на CX?

    Вобщем,подскажите,кто что может.Благодарю.
  • Программирование :: Общий
  • Собственно нужна инфа по ним:

    ∙   DataMatrix
    ∙   QR
    ∙   UPC-E
    ∙   UPC-A
    ∙   EAN-8
    ∙   EAN-128


    В идеале хочу сам их отрисовывать под виндой в gdi+. Если кто такое делал, насколько это всё сложно? Пока стоит вопрос оценки затрат времени. Мнения слышал - до недели, про код, но мне что-то не верится. Так может лучше готовую библиотеку купить? Какую?
    Лично я пока против таких решений, как правило они генерят картинки, мне же лучше самому их отрисовывать в DC.
    С другой стороны, бегло погуглив, мне кажется что это не так всё сложно. Правда чёткого описания алгоритмов не нашёл.
    В вики стоит:
    Цитата
    Хотя стандарт является свободным, нет бесплатных документов, описывающих процесс кодирования.

    Так ли это?
  • Проблема наблюдается в компиляторах как C++, так и C#, и, возможно, других языков со статической типизацией и параметризированными классами.

    Есть классы:
    Код: (c++)
    template<class A, class B> class Z {};
    template<class C, class D> class Y {};
    template<class E, class F> class X: public Z<Y<E, F>, F> {};
    template<class G, class H> class W: public Y<G, H> {};
    class V {};
    class U {};
    class T: public X<W<V, U>, U> {};

    Z<W<V, U>, U> *a = new T();
    Чисто логически и теоретически последняя строчка должна выполняться, поскольку T - потомок Z, несмотря на параметры. На уровне байтов памяти (в случае reinterpret_cast) совместимость будет. Однако компиляторы заявляют, что приведение типов невозможно.

    Компилятор работает последовательно: сначала он подставляет параметры шаблонов, и только потом полученный код обрабатывается на предмет сочетаемости типов в силу наследования.

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

    В случае перебора по аналогии с тем, как работает среда исполнения Prolog, дерево поиска выглядело бы следующим образом:
    Код:
    T
      :
        [
         E = W<V, U>
         F = U
        ]
        X<W<V,U>,U>
          = [
             W<V,U>
              : [
                 C = G = V
                 D = H = U
                ]
                Y<V,U>
            ]
            X<Y<V,U>,U>
             : [
                A = E = Y<U, V>
                B = F = U
               ]
               Z<Y<Y<V,U>,U>,U> !
             : [
                A = Y<E,F>
                     = [
                        E = V
                        F = U
                       ]
                       Y<V,U>
                B = F = U
               ]
               Z<Y<V,U>,U> !
          : [
             A = E = W<V,U>
             B = F = U
            ]
            Z<Y<W<V,U>,U>,U> !
             = [
                W<V,U>
                 : [
                    C = G = V
                    D = H = U
                   ]
                   Y<V,U>
               ]
               Z<Y<Y<V,U>,U>,U> !
          : [
             A = Y<E,F>
                  = [
                     E = V
                     F = U
                    ]
                    W<V,U>
                     : [
                        C = G = V
                        D = H = U
                       ]
                       Y<V,U>
             B = F = U
            ]
            Z<Y<V,U>,U> !
    : - наследование, = - подстановка, [] - предварительные вычисления, ! - результат

    Из этого следует: во-первых и главное, неопределённость результатов типизации, которая заставит компилятор хранить все варианты типов для согласования разных мест программы, каждый раз подбирая наиболее подходящее соответствие и умножая неопределённость типа в расчётных цепочках (особенно в свете новомодных деклараций с автоматической типизацией - auto и var); во-вторых, пример благополучно разрешился бы.

    Но... реальность грубее и примитивнее. У компиляторов лишь один вариант приведения:  Z<Y<Y<V,U>,U>,U>. С одной стороны, это хорошо, что один, с другой стороны, это следствие упрощённых алгоритмов анализа кода с минимумом отложенных решений.
  • Программирование :: Общий :: Алгоритмы и математические задачи.
  • Подскажите люди добрые - где искать-читать.
    Задача разделить оптимально отрезок длиной LL на N отрезков заданных длин (L1*N1), (L2*N2), ....
    С учетом дополнительных ограничений для N1, N2 .... (например, N1>=3, 0<=N1,<=2 )
    ---
    Вопрос возник не из-за неумения пользования wiki или googl, а по причине огромного объема инф-ии
    (а выбрать нужное, требуется достаточно хорошо знать математику)
    Исходные.
    1. Задача как для оптимизационной должна даваться в кач-ве примера. Мнеб достаточно ссылки.
    2. Разделы математики - линейное программирование, матем. прогр-ие, дискретная математика.
    (давно сталкивался с транспортной задачей)
    3. В математ. теории я разбираюсь слабо. Задача-решение нужно для прикладного использования.
    4. Нужен алгоритм в матем. описании или C.
    ---
    Всем спасиб :)
  • Программирование :: Технологии разработки программных систем
  • Все доброго времени суток. В общем есть такое задание: сформировать набор предложений клиенту по целевым кредитам различных банков для оптимального выбора. Учитывать возможность досрочного погашения и/или продления кредитной линии. Реализовать выбор и поиск кредита.

    В общем, как я понял это задание: я (пользователь программы) - клиент банка, т.е. банк - кредитор а я - заемщик.
    Банки могут предоставлять кредиты различных видов. Мне (как клиенту) требуется из множества банков выбрать подходящий кредит с помощью поиска. Т.е. я ввожу параметры поиска (возможность продления, возможность досрочного погашения, процент кредитования, сумма кредита, кредит сроком до..., еще может что-нибудь посоветуете) , а программа выбирает мне по моим запросам подходящие кредиты различных банков.
    Задача должна решаться с помощью ООП.
    Поделитесь пожалуйста идеями, как можно решить данную задачу.
    Я не прошу написать техническое решение данной задачи, с помощью какого либо языка. Просто было бы здорово, если бы подкинули UML диаграмму решения данной проблемы.

    P.S. Возможно я не очень подробно изложил то чего хочу, т.к. сам еще не сильно понимаю, но думаю суть ясна.
    Спасибо.
  • Программирование :: .NET технология от и до
  • Собственно сабж. Есть ли способы? Есть метод, его надо выполнить много раз, отличие только в том что для каждого метода разные входные данные. Хотелось бы увеличить производительность выполняя эти методы параллельно. (использую C#)
  • Здравствуйте!

    Столкнулись с проблемой. Создаем элемент TreeView в XAML коде. И создаем кнопочку, по нажатию на которую создаем новый TextBox  и помещаем его в коллекцию дерева. И проблема в том, что он не может получить фокус программно. Точнее он туда курсор ставит, но ввод не идет.

    ButtonClick такой:
    Код:
    TextBox tb = new TextBox();
    treeView1.Items.Add(tb);
    tb.Focus();
    tb.Focus() возвращает false.

    Может кто-нибудь помочь?

  • Программирование :: .NET технология от и до :: ADO.Net
  • Привет!

    Необходимо разобраться с ADO.NET. Подскажите литературу или сайт, что почитать для начинающего? Работаю с SQL Server на Visual C# 2008.

    Спасибо.
  • Программирование :: C/C++
  • подскажите пожалста, никак не компилится
    Код:
    #pragma comment(lib,"sqlite3.lib")
    #include <stdio.h>
    #include <stdlib.h>
    #include <sqlite3\sqlite3.h>

    int main(int argc, char** argv)
    {
        sqlite3 *db = NULL;
        int rc;
        char dbfn[] = "_MyLib.db";

        rc = sqlite3_open(dbfn, &db);
        if(rc){
            fprintf(stderr, "Can't open database: %s\n", dbfn);
            return(EXIT_FAILURE);
        }


        sqlite3_close(db);
        return (EXIT_SUCCESS);
    }

    выдает ошибку
    Код:
    Wedit output window build: Tue Nov 01 13:45:07 2011
    Error d:\test\test.c 12 undefined reference to _sqlite3_open
    Error d:\test\test.c 19 undefined reference to _sqlite3_close
    search
    Compilation + link time:0.3 sec, Return code: 2
    гугл не помог, в чем тут дело?
  • Код: (cpp)
    AnsiString b[100][4];
    FILE *Fp;
      Fp=fopen("text.txt","r");
      fscanf(Fp,"%d",&n);
      for(int i=0;i<n;i++)
      for(int j=0;j<4;j++)
      fscanf(Fp,"%s",&b[i][j]);
      fclose(Fp);
    Здравтсвуйте, скажите ,пожалуйста,можно ли таким образом считывать слова в массив??(p.s. у меня так не получилось,но может можно как-то подправить?)
  • Необходимо реализовать серверную часть для общения с клиентскими браузерами по http.
    Что для этого лучше использовать cgi, fastcgi или создание собственного (web-сервера) сервиса/демона и каких-то библиотек работающих с http?

    Желательна кроссплатформенность.
    Одновременных запросов до нескольких штук. Одновременных сессий до сотни.
    Нужна серьёзная многопоточная с параллелизмом по ядрам обработка данных полученных из СУБД.
  • Возникла тут необходимость создать поток совместимый с STL, который будет сжимать / распаковывать данные при помощи библиотеки zlib (интересует именно расширение STL, а zlib - там все просто). Кто чего может посоветовать? Может есть чего почитать по данной теме?
  • Здравствуйте.  Раньше с таким не сталкивался... - у компонента StringGrid непостоянное число строк и столбцов. Ну, нормально... !  При попытке создать образ таблицы для работы с ним -
    ... AnsiString  tabl2[StringGrid1->ColCount][StringGrid1->RowCount]
    выдает ошибку:   Constant expression required.  То-есть при инициализации tabl2 требует константы. Не придумаю, как решить такую простую задачу. Помогите кто знает...  :confused:
  • Программирование :: C/C++ :: ANSI С/С++
  • Всем привет. Надо реализовать словарь слово-значение тремя способами: 1) хеш-таблицами 2) разделенными списками 3) деревьями
    Пытаюсь пока реализовать первым способом.
    Класс node.h:
    Код:
    class Node {
    public:
    char *word;
    char *meaning;
    Node *next;

    Node(void): word(0), meaning(0), next(0) {};
    ~Node(void);

    void SetNode(char *wrd, char *mning);

    bool operator==(const Node &obj);
    Node operator=(const Node &obj);
    friend ostream &operator<<(ostream &stream, Node &obj);

    };
    node.cpp
    Код:
    Node::~Node(void) {
    if(next) {
    delete next;
    next=0;
    }
    if(word) {
    delete []word;
    word=0;
    }
    if(meaning) {
    delete []meaning;
    meaning=0;
    }
    }

    void Node::SetNode(char *wrd, char *mning) {
    int wrdLen=strlen(wrd);
    int meaningLen=strlen(mning);

    word=new char[wrdLen];

    for(int i=0; i<wrdLen; i++)
    *(word+i)=*(wrd+i);
    *(word+wrdLen)='\0';

    meaning=new char[meaningLen];

    for(int i=0; i<meaningLen; i++)
    *(meaning+i)=*(mning+i);
    *(meaning+meaningLen)='\0';
    }

    bool Node::operator==(const Node &obj) {
    bool res=true;
    int len=strlen(word);

    if(len!=strlen(obj.word))
    return false;

    for(int i=0; i<len; i++)
    if(*(word+i)!=*(obj.word+i))
    res=false;

    return res;
    }

    ostream &operator<<(ostream &stream, Node &obj) {
    stream<<"Word: "<<obj.word<<". Meaning: "<<obj.meaning;

    return stream;
    }

    Node Node::operator=(const Node &obj) {
    if(*this==obj)
    return *this;
    SetNode(obj.word, obj.meaning);

    return *this;
    }
    Теперь класс HashTable. Тут проблема пока что с добавлением элемента.
    Вот .h файл:
    Код:
    #include "Node.h"
    #include <iostream>
    typedef unsigned long long hashIndexType;

    using namespace std;

    class HashTable {
    int hashTableSize;
    Node **hashTable;
    public:
    HashTable(void): hashTableSize(0), hashTable(NULL) {};
    ~HashTable(void);

    hashIndexType HashFunc(char *word);
    Node *InsertNode(char *word, char *meaning);
    Node *FindNode(char *word);
    void DeleteNode(char *word);
    bool CompStr(char *str, char *str1);
    };
    Вот функция добавления:
    Код:
    Node *HashTable::InsertNode(char *word, char *meaning) {
    Node *newNode=0, *temp=0; //адрес нового узла и временного, в котором будет хранится адрес след. ячейки таблицы
    hashIndexType indx=0; //индекс новго элемента в таблице

    indx=HashFunc(word); //получаем индекс нового элемента
    try {
    newNode=new Node; //выделяем память для нового элемента
    }
    catch(bad_alloc ba) {
    cout<<"Error: "<<ba.what()<<endl;
    exit(1);
    }

    newNode->SetNode(word, meaning); //заполняем вновь созданный элемент
    temp=hashTable[indx]; //запоминаем значение, хранящееся в ячейке с найденным индексом
    hashTable[indx]=newNode; //записываем новый элемент в массив
    newNode->next=temp; //смещаем указатель на следующий элемент

    return newNode;
    }

    Дебагер выкидывает из программы на строке
    Код:
    temp=hashTable[indx];
    Не подскажите в чем проблема?
  • Всем привет. Задание такое: создать программу обработки учебника по программированию с использованием классов: символ, слово, предложение и т.п. Заменить табуляции и последовательности пробелов одним пробелом.
    То есть, у меня есть файл с текстом (см. в аттаче). Необходимо прочитать текст из этого файла и обработать его.
    Я написал класс слово (Word.h):
    Код:
    class Word {
    char *wrd;
    int len;

    void SetWord(char *word);
    public:
    Word(void): wrd(0), len(0) {}
    Word(char *word);
    Word(const Word &obj);
    ~Word(void);

    int GetLen(void) const {return len;}
    int CharCount(char ch) const;
    char GetFirstSymbol(void) const {return *wrd;}
    void GetWord(char *string, int begindx, int endindx);

    friend ostream &operator<<(ostream &stream, Word &obj);
    friend istream &operator>>(istream &stream, Word &obj);
    Word operator=(const Word &obj);
    Word operator=(char *word);
    };
    и класс предложение, являющееся массивом слов и завершающееся одним из "завершителей" (!, ., ?).
    Sentence.h
    Код:
    class Sentence {
    int len;
    int size;
    Word *wrds;
    char *sntnce;

    void SetSentence(char *sentence);
    bool IsSeparator(char symbol);
    void GetWords(void);
    void DelRepeatSpaces(char *sentence);
    public:
    Sentence(void): len(0), size(0), wrds(0) {}
    Sentence(char *sentence);
    Sentence(const Sentence &obj);
    ~Sentence(void);

    int GetWordsCount(void);
    int GetLen(void) const {return strlen(sntnce);}

    friend ostream &operator<<(ostream &stream, Sentence &obj);
    friend istream &operator>>(istream &stream, Sentence &obj);
    Sentence operator=(const Sentence &obj);
    Sentence operator=(char *sentence);
    };
    А вот что делать дальше - я не придумал. Надо создать класс текст, который будет массивом предложений. Проблема в том, что бы считать из файла количество предложений, выделить необходимую память для всех предложений и записать в каждый из элементов массива предложений эти предложения. Плюс ко всему надо сохранить пунктуацию, т.е. обзацы.
    Подскажите пожалуйста, как реализовать класс текст.
  • Программирование :: C/C++ :: WinAPI & Visual C++
  • забавная проблема напала: получается, что функция FindNextFile нереентерабельна, из-за чего рекурсивный поиск содержимого папки происходит неверно

    (слева - моё дерево, справа - проводниковое)
    содержимое папки C:\1111111111\2\3\  показано верно (она первая была просмотрена) , а вот папка C:\1111111111\3  показывает то же самое, что в предыдущей, хотя там совсем не то

    (http://forum.shelek.ru/index.php?action=dlattach;attach=6186;image)

    И как же этот рекурсивный поиск сделать, неужели вытаскивать содержимое по одной папке, затем по этим файлам пробегаться снова и заходить в каждую папку ?
  • Итак господа имеем следующее:
    Приложение, которое при запуске под Win7, под User требует прав Admin - выскакивает окошко UAC, я ввожу пароль, оно запускается от Admin естественно. Не вдаваясь в логику приложения скажу, что оно запрашивает определенные файлы из AppData, путь к AppData формируется ф-цией
    Код: (cpp)
    SHGetFolderPathW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, appDataDir)
    и так как приложение запущенно от Admin, все пишется/читаеться в/из AppData  Admin'a. Пробороздив просторы MSDN я выяснил, что третий параметр передаваемый в ф-цию есть HANDLE hToken  и если передать туда тоукен User, то все пути для него корректно пропишутся. Получить тоукен можно ф-циями OpenProcessToken(); или LogonUser (); но так как приложение запущенно от Admin мне всегда (тем или иным способом) возвращается его тоукен.   

    Господа, помогите красиво выйти из ситуации и получить корректный путь для работы моего приложения независимо от того, что оно требует Admin прав.
  • Элементарный вопрос. Как изменить флаг WS_VISIBLE после создания компонента? Да и вообще как манипулировать параметрами после создания? Я подозреваю, что в этом как-то замешана функция SetProperty, но её параметр типа DISPID, ставит меня в тупик.
  • Программирование :: C/C++ :: C/C++ Unix
  • Здравствуйте уважаемые!

    мне нужно извлечь при помощи этой библиотеки серийный номер usb  устройства. подскажите пожалуйста как пользоваться структурой:

    Код: (c)
    static inline int libusb_get_string_descriptor(libusb_device_handle *dev,
    uint8_t desc_index, uint16_t langid, unsigned char *data, int length)
    {
    return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN,
    LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING << 8) | desc_index,
    langid, data, length, 1000);
    }

    либо:

    Код: (c)
    int libusb_get_string_descriptor_ascii(libusb_device_handle *dev,
    uint8_t index, unsigned char *data, int length);

    нижеследующий код компилируется, но при запуске выдает Segmentation fault:


    Код: (c)
    static void print_devs(libusb_device **devs)
    {
    libusb_device *dev;
    libusb_device_handle *DevHandle;
    unsigned char *data;
    int i = 0;

    while ((dev = devs[i++]) != NULL) {
    struct libusb_device_descriptor desc;
    int r = libusb_get_device_descriptor(dev, &desc);
    if (r < 0) {
    fprintf(stderr, "failed to get device descriptor");
    return;
    }

    libusb_get_string_descriptor_ascii(DevHandle,desc.iSerialNumber,data,20);
    printf("VID:%04x PID:%04x SN:%04x\n",
    desc.idVendor, desc.idProduct,  data);
    }
    }
  • Программирование :: Delphi
  • При создании динамических комбобоксов есть присвоение:
    combobox.OnChange := ComboboxChange;
    Она объявлена так:
    procedure ComboboxChange(Sender:TObject);

    На этом куске кода:
    Код: (delphi)
    procedure TRegistrationForm.SetStateButton();
    var
      i : Word;
      combo : TCombobox;
    begin

      for i := 1 to QuantityQuestion do
      begin
        combo := arrCombobox[i].pCombobox;

        if (combo.Enabled) then
          combo.OnChange(combo);

      end;

    end;
    на строчке
    combo.OnChange(combo);
    наблюдается ексэпшен:
    (http://s017.radikal.ru/i422/1111/b3/df54134c3e8a.jpg)

    Где закралась ошибка ?
  • У меня есть тексты ответов и соответствующие им ID из БД.

    В расположенный на форме комбобокс это было все в цикле помещено:
    combobox.AddItem(TextAnswer, TObject(idAnswer));

    А затем. на OnShow формы я хочу чтоб в комбобоксе был выбран вариант соответствующий определенному ID. Как это элегантно сделать?
  • Если пользователь нажал кнопку "Добавить" - у него открылось диалоговое коно, в окне поле типа TDBEdit. Он в него что-то ввел,
    затем передумал добавлять запись и нажал отмена. Как обнулить поле TDBEdit?

    Сейчас у меня так:
    Код: (delphi)
    procedure TFormEditBranch.btCancelClick(Sender: TObject);
    begin
      //edBranch.Text := NULL;
      DataModule1.ADOTableBranch.Cancel;
    end;

    Но некоторые пишут, что для вставки новой записи следует использовать форму не с элементами TDBEdit, а с обычными TEdit:
    Добавление информации из DBEdit в DBGrid нажатием кнопки
    Ввод данных через DBEdit

    Что думаете по этому поводу?
  • Например, вы открыли форму, для того чтобы ввести поля новой записи.
    Заполнили все, что требовалось. На каком событии делать запись в лог-таблицу?

    При таком коде :
    Код: (delphi)
    procedure TDataModule.ADOTable1AfterPost(DataSet: TDataSet);
    var
      SQLText : String;
    begin

      SQLText := 'INSERT INTO log (textmessage) VALUES (''В таблицу такую-то вставлена запись. Поле такое-то равно : '
                        +   ADOTable1.FieldByName('name').AsString) + ''' ';

      try
        with ADOQuery1 do
        begin
          SQL.Clear;
          SQL.Add(SQLText);
          ExecSQL;
        end;
      except
         on e:Exception do
      end;

    end;
    пожалуй и обычное редактирование уже присутствующей записи спровоцирует логгирование ?
  • доброго времени суток!может ли мне кто-то подсказать как убрать identity из хедерсов моих get post запросрв??
    варианты типа:
    http.Request.AcceptEncoding:='gzip, deflate';
    не прокатывают!!
  • У меня есть таблица с филиалами, каждый находится в каком-то городе, на что указывает поле id_city. Когда все это помещу в грид, то хотелось бы, чтобы был столбец заполненный названиями городов принадлежности филиалов. Используем Lookup-поля.
    (http://i080.radikal.ru/1110/e4/13e1fe7f42bb.jpg)

    На компоненте ADOTableBranch выбрал Fields Editor..., в нем сделап "New Field...".
    Из какого принципа там заполняется поле "Component"  ?

    В поле Key Fields я предполагал, что выберу внешний ключ таблицы, а именно - "id_city". Но как показывает рисунок, там в списке лишь поле name (это поле, хранящее наименование филиала). Почему ?


    Инструкции:
    1. Работа с локальными БД в Delphi. Работа с полями. Использование объектов класса TField. Создание полей выбора данных (Lookup-полей
    2. Работа с DBGrid

    Delphi XE
  • Программирование :: VisualBasic
  • Составить программу, проверяющую, является ли введенная с клавиатуры строка представлением пятнадцатиричного целого числа:
    Составила на VB 2005:
    Public Class Form1
        Dim stroka As String
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            stroka = InputBox("Введите строку")
            If UCase(stroka) Like "*[!0-9A-E]*" Then Label1.Text = "Является" Else Label1.Text = "Не является"
        End Sub
    End Class

    Но при вводе , например, 987G3  или ++21 выдает "Является" что неправильно? Подскажите пожалуйста!!!

  • Программирование :: Программирование 1С
  • Всем здравствуйте. Скажите можно ли в 1с нормально зарабатывать без сертификатов? Проблема со сдачей. не могу выучить профов :(
  • Проблема !! При проведении документа "переоценка товаров в рознице" есть товары с одинаковым наименованием. Естественно документ не проводится. Документ создан на основании "переноса из торговли 7.7. Без этого документа не проводятся остальные документы наподобии "Оприходование товаров" Как быть? Помогите!!!!
  • Программирование :: Программирование 1С :: 1С 7.x
  • Я работаю на достаточно большем предприятии и главбух решил меня озадачить "прикрутить Клиент-Банк к 1С". Всё это прикольно только я в програмировании 1С теоретик. Всё больше занимался администрированием *nix, а тут вот понимаю что всё таки прийдётся вникать. Вопрос - люди объясните с чего начать побеждать поставленную задачку. А оптимальный вариант вообще - пошагово навояйте что творить. Заранее спасибо. Если что ICQ-237553763
  • Здравствуйте!Столкнулся с проблемой,платформа 7.7.,  нужно сделать возврат товара.Делаю следующее:
    Журналы-Документы ККМ-выбираю операцию  Ввести на основании на том документе в котором нужно сделать возврат выбираю Чек ККМ-в расходной выбираю вид операции чек на возврат, провожу , вместо того чтобы товар вернулся он снова списывается.... Помогите разобраться !!!
  • Здравствуйте!Начинаю постигать азы 1С, стоит  программа 1С в. 7.7. У меня вопрос как мне сделать чтобы в таблице которая выводиться на печать считалась строка ИТОГО по колонке, какую формулу использовать и как правильно ее набрать в модуле???
  • Всем доброго дня!
    1с 7.7. ТиС.
    Опыта очень мало. Нужна идея, как реализовать, что-бы рыть самостоятельно дальше)).
    Требуется отчет типа: по вертикале позиции номенклатуры, по горизонтали  4 столбца
    количества продаж в определяемые пользователем периоды и 5-ый столбец - остаток товара на сегодня.
    Подскажите идею формирования запроса и группировок.
    Или как можно в одном отчете перечислить данные по 4 временным периодам (задаются произвольно).
    Заранее благодарен
  • Программирование :: Программирование 1С :: 1С 8.x
  • И снова здраствуйте у меня вот такой вопрос. Возможно ли сделать в табличной части иерархию следующего вида с возможностью подсче результатов по всем её уровням.(http://s58.radikal.ru/i161/1111/d1/88c425475e7f.jpg) Колонка средство заполняеттся только напротив ФИО, а вот по колонке количество должны считатся итоги по всем уровням иерархии. Читал что в табличной части делают при помощи дерева значений, а вот с суммой ничего нашёл. Если кто видел решение подобной задачи можно предоставить код.  Заранее благодарен.
  • Создаю новый Word-документ:

    Код:
    	WORD = Новый COMОбъект("Word.Application");
    НовДокум = WORD.Documents;
    Докум = НовДокум.Add("");
    WORD.Visible = 1;
    WORD.WindowState = 0;
    WORD.Activate();

    Пользователь его редактирует, сохраняет где-то под каким-то именем.

    Вопрос - как мне перехватить имя сохраненного файла, чтобы закатать его в ХранилищеЗначения?
  • Здравствуйте!
    Есть 2 базы 1с 7.7 бухгалтерии (центральная и периферийная). Конфигурация на столько изменена, что от стандартной бухгалтерии ничего не осталось. Как можно реализовать переход на 1с 8.2 (бухгалтерию), чтоб сделать такую же конфигурацию по максимуму как в 7.7 , перенести данные, надо еще, чтоб базы работали через веб-интерфейс?
    1. Думала, может конвертором ИБ предприятия 7.7 воспользоваться, но конфигурация создается криво + код 7ки просто закомменченный + перенеслись только справочники - все это исправить очень долго, да и практически не реально привести в нормальный вид.
    2. Конфигурацию дорабатывать своими силами, писать обработку для переноса данных.
    Подскажите пожалуйста!!! Может еще есть варианты? :dontknow:
  • Программирование :: Программирование 1С :: 1С 8.2: Управляемое приложение
  • Доброго всем времени суток!

    Суть в следующем:
    Есть нетиповая конфигурация Бух 8.2.25.5. Обновляю методом сравнения и объединения на следующий релиз 8.2.26.8.
    Снимаю галочку на измененных мной объектах(В новом релизе эти объекты не изменены).
    Объединяю. Заново сравниваю. Почему-то не переносятся некоторые объекты (формы отчетов и документов).
    Режим - взять из файла.

    В чем может быть причина ?
  • Доброго времени суток всем!!!
    Пл. 8.2.14.537 Бухгалтерия 2.0.27.8 типовая.
    В пользовательском режиме бухгалтер завел документ РасходныйКассовыйОрдер с видом операции Взнос наличными в банк.
    Затем удалил его. Но, "чудесным образом":
    1 документ остался в журнале докуентов (и только там). При открытии документа из этого журнала появляется окно с выбором вида операции и создается новый документ.
    При попытке установить метку на удаление ничего не меняется (метка не устанавливается).
    В журнале проводок есть запись, сформированная этим документом. Регистратор записи - <Объект был удален> (102:fgfd6gf6g5fd766f47xb).
    В базе этого документа (Объект) нет.
    Что я зделал: Создал обработку которая удалила запись регистра Бухгалтерии.
    Но как удалить документ(запись списка документов) из журнала документов.
    Запросом выбрал запись журнала документа со ссылкой на документ(Объект, которого уже нет).

    Пробовал Тестирование и исправление (все варианты) - при чтении Журала документов завершается работа конфигуратора аварийно.
    Пробовал программой chkdbf - проверка проходит но изменений нет.
    Как удалить эту ссылку ?
  • Здрасте. Как обновить табличнуючасть.
    В обработке в данных создал табличную часть Поступ элементы
    с таким составом
    Элемент1 1
    Элемент2 2
    Элемент3 3
    Как обновить табличную часть? Спасибо
  • Всем здравствуйте. Требуется помощь. В модуле объекта инициирован ком объект. создается он нормально. как его вызвать правильно чтобы использовать.
    делаю так.
    Код:
    Модульные_Переменные = РеквизитФормыВЗначение("Объект");
    Модульные_Переменные.КомОбъект
    У ком объекта "Экспорт" прописан.
    Условие вызова &НаСервере.
  • Операционные системы :: Unix и другие :: Linux
  • Установил, сетевые интерфейсы настроил:
    [expand=ifcfg-eth0][console]
    DEVICE="eth0"
    NM_CONTROLLED="yes"
    ONBOOT=yes
    HWADDR=00:0C:29:2F:6D:E5
    TYPE=Ethernet
    BOOTPROTO=none
    IPADDR=192.168.30.100
    PREFIX=24
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=yes
    IPV6INIT=no
    NAME="System eth0"
    UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
    [/console][/expand]
    [expand=ifcfg-eth1]
    Реальные IP & Gate изменены[console]
    DEVICE="eth1"
    NM_CONTROLLED="yes"
    ONBOOT=yes
    TYPE=Ethernet
    BOOTPROTO=none
    IPADDR=12.34.56.78
    PREFIX=24
    GATEWAY=12.34.56.1
    DNS1=4.4.4.4
    DNS2=8.8.8.8
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=yes
    IPV6INIT=no
    NAME="System eth1"
    UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
    HWADDR=00:0C:29:2F:6D:EF
    [/console][/expand]

    Для внутренней карты Gate & DNS не прописаны - это верно или нет?

    Как теперь дальше решить следующие задачи:
    1. Настроить его (сервер) как роутер для машин из внутренней сети 192.168.30.0/24
    2. Настроить как кеширующий DNS сервер, чтобы во внутенней сети указывать его (192.168.30.100)
    3. Пробросить порты из-вне на внутенние сервера

    С (3) вопросом вроде понятно - RXL мне писал пример, а вот первые 2 - не знаю :(
  • Оживлю раздел, т.к. появится много вопросов (в линукс - полный чайник, но приходится...).

    Итак, что имеем:

    Есть реальный сервер, на котором стоит Vmware ESXi.
    На сервере хочется настроить виртуальную сеть и все порты необходимых служб с виртуальных машин пробрасывать через роутер. В будующем виртуальных сетей может быть несколько, а роутер - один.
    Виртуальные машины (естественно кроме роутера) имеют только локальные сетевые адреса (192.168.)
    Все дополнительные сервисы (базы данных, системы контроля версий и пр.) будут настаиваться только на виртуальных машинах.

    Что уважаемое сообщество может посоветовать в качестве роутера?
    Задача - проброс портов и (возможно) переадресация сайтов (http, ftp) на разные виртуальные сервера. Может быть какой-то небольшой (по объему инормации) служебный ftp - большие ftp будут на виртуальных машинах.
    Что выбрать в качестве ОС и какие ресурсы выделить для виртуальной машины под роутер? Основной критерий - стабильность и надежность, затем - простота настройки.

    P.S. Почему в разделе Linux - *nix виртуальные машины планируются на CentOS, чтобы не было лишней чехарды с системами
  • Направления программирования :: Drivers
  • Здравствуйте, такая прямо беда со мной приключилась, написал по книге простейший драйвер, да вот компилятор ошибку выдаёт (ваще её там не должно быть!). Вот текст где ошибки (функция DriverEntry)
    Код:
             DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateMyDriver;
             DriverObject->MajorFunction[IRP_MJ_READ] = ReadMyDriver;
             DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteMyDriver;
             DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ShutdownMyDriver;
             DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlMyDriver;
             DriverObject->DriverUnload = MyDriverUnload;

    В книге Уолтера Они "Использование Microsoft Windows Driver Model (WDM)" ясно описана, вся структура данных DriverObject и там есть такая штука, как MajorFunction, а компилятор на эти строки ругается, что мол:
    assignment from incompatible pointer type.

    А вот весь этот простой текст драйвера.
    Код:
    #include <ntddk.h>
    #include <MyDriverMessages.h>

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);

    NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    NTSTATUS WriteMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    NTSTATUS ShutdownMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    NTSTATUS CleanupMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    NTSTATUS IoCtlMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    VOID MyDriverUnload (IN PDRIVER_OBJECT DeviceObject);

    BOOLEAN GetMessage(IN NTSTATUS ErrorCode, IN PVOID IoObject, IN PIRP Irp);

    #ifdef ALLOC_PRAGMA
    #pragma alloc_text(PAGE, GetMessage)
    #endif

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

    {
             UNICODE_STRING nameString, linkString;
             
             PDEVICE_OBJECT deviceObject;
             
             NTSTATUS status;
             
             GetMessage(MSG_DRIVER_ENTRY, DriverObject, NULL);
             
             RtlInitUnicodeString(&nameString, L"\\Device\\MyDriver");
             
             status = IoCreateDevice(DriverObject, sizeof(65533), &nameString,
                                     0, 0, FALSE, &deviceObject);
             if (!NT_SUCCESS(status))
               return status;
             deviceObject->Flags |= DO_DIRECT_IO;
             deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
             RtlInitUnicodeString(&linkString, L"\\DosDevices\\MyDriver");
             status = IoCreateSymbolicLink(&linkString, &nameString);
             if (!NT_SUCCESS(status))
             {
               IoDeleteDevice(DriverObject->DeviceObject);
               return status;
             }
             DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateMyDriver;
             DriverObject->MajorFunction[IRP_MJ_READ] = ReadMyDriver;
             DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteMyDriver;
             DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ShutdownMyDriver;
             DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlMyDriver;
             DriverObject->DriverUnload = MyDriverUnload;
             return STATUS_SUCCESS;
    }


    NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)         
    {
             GetMessage(MSG_CREATE, (PVOID)DeviceObject, NULL);
             IoCompleteRequest(Irp, IO_NO_INCREMENT);
             
             Return STATUS_SUCCESS;
    }


    NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
             GetMessage(MSG_READ, DeviceObject, NULL);
             
             return STATUS_SUCCESS;
    }
             
             
    NTSTATUS WriteMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
             GetMessage(MSG_WRITE, DeviceObject, NULL);
             
             return STATUS_SUCCESS;   
    };   
     
     
    NTSTATUS ShutdownMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
             GetMessage(MSG_SHUTDOWN, DeviceObject, NULL);
             IoCompleteRequest(Irp, IO_NO_INCREMENT);
             return STATUS_SUCCESS;
    }
                     
         
    NTSTATUS IoCtlMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)

             GetMessage(MSG_IOCTL, DeviceObject, NULL);
             IoCompleteRequest(Irp, IO_NO_INCREMENT);
             return STATUS_SUCCESS;
    }     
             
             
    VOID MyDriverUnload (IN PDRIVER_OBJECT DriverObject)
    {
         UNICODE_STRING linkString;
         GetMessage(MSG_DRIVERUNLOAD, DriverObject, NULL);
         RtlInitUnicodeString(&linkString, L"\\DosDDevices\\MyDriver");
         IoDeleteSymbolicLink(&linkString);
         IoDeleteDevice(DriverObject->DeviceObject);
    }


    BOOLEAN GetMessage(IN NTSTATUS ErrorCode, IN PVOID IoObject, IN PIRP Irp)
    {
            PIO_ERROR_LOG_PACKET Log_Packet;
            PIO_STACK_LOCATION IrpStackLocation;
            PWCHAR pInsertString;
            STRING AnsiInsertString;
            UNICODE_STRING UniInsertString;
            UCHAR Size_of_Packet;
            Size_of_Packet = sizeof(IO_ERROR_LOG_PACKET);
            Log_Packet = IoAllocateErrorLogEntry(IoObject, Size_of_Packet);
            If (Log_Packet == NULL)
              return FALSE;
            Log_Packet->ErrorCode = ErrorCode;
            Log_Packet->UniqueErrorValue = 0;
            Log_Packet->RetryCount = 0;
            Log_Packet->SequenceNumber = 0;
            Log_Packet->IoControlCode = 0;
            Log_Packet->DumpDataSize = 0;
            if (Irp != NULL)
            {
                    IrpStackLocation = IoGetCurrentIrpStackLocation(Irp);
                    Log_Packet->MajorFunctionCode = IrpStackLocation->MajorFunction;
                    Log_Packet->FinalStatus = Irp->IoStatus.Status;
            }
            else
            {
                Log_Packet->MajorFunctionCode = 0;
                Log_Packet->FinalStatus = 0;
            }
            IoWriteErrorLogEntry(Log_Packet);
            return TRUE;
    }
  • Здравствуйте!
    Есть такая задачка: имеется некое устройство, типа клавиатуры. Виндой оно и определяется как HID клавиатура, поэтому и работает вместе с основной клавой(как одна или в один поток). Но хочется, чтобы эта клавиатура работала не всегда, а только тогда, когда ей скажут, то есть в конкретном приложении. В общем все видимо сводится к написанию драйвера.

    Прочитал уже достаточно разного материала, но как то так и не получилось извлечь нужное. Каша в голове)
    Сейчас больше инетересует как получать данные с устройства. DriveEntry и прочие общие понятия вроде как усвоились.

    http://www.e-reading.org.ua/bookreader.php/130090/Tarvo_-_Ispol'zovanie_NuMega_DriverStudio_dlya_napisaniya_WDM-draiiverov.html - вот вроде как хороший пример, но к сожалению DriverStudio не работает на версиях винды старше XP SP2.
    То есть что нить бы подобное под WDK...

    И надо чтобы в итоге это все кончилось какой-нить dll по взаимодействую с этим устройством, ну или в идеале - .NET объектом )
  • Подскажите по типам драйверов и расположении в иерархии.
    Интересует Windows. В будущем Linux.
    Делаю RAM диск с сжатием. Отведенное ОЗУ фиксировано, а объем устройства плавает в зависимости от

    степени сжатия записываемой информации. Соотвественно мне нужно писать драйвер логического диска,

    это Kernel mode drivers (драйверы режима ядра) -> уровень промежуточный (intermediate) драйвера

    виртуальных дисков.
    Возникает несколько вопросов:
    1. Как быть с динамически меняющимся размером блоков или их количеством в зависимости от сжатия?
    2. Какой тип драйвера имеет доступ и управление к таблице занятых кластеров/блоков?
    3. Какой тип драйвера имеет доступ и управление к таблице бэд секторов и какие виды секторов помимо

    bad и good бывают?

    Правильно ли я представляю себе иерархию драйверов?

    Драйвер файловой системы (Kernel mode drivers (high-level))
      ^ |
      |  V
    Буферный кэш-пул
      ^ |
      |  V
    Драйвер логического диска (виртуального) (Kernel mode drivers (intermediate-level))
      ^ |
      |  V
    Драйвер физического диска (устройства) (Kernel mode drivers (low-level))
      ^ |
      |  V
    Физический диск (устройство)

  • Всем привет. Необходимо что бы драйвер записывал данные в файл. Записывать то он записывает  :), но вот записывает непонятно что в общем кракозябы какие то. Думаю в чем то ошибся. Вот сама функция которая пишет:
    Код: (cpp)
    VOID WrtFile(UNICODE_STRING nFile, PVOID str)
    {
    OBJECT_ATTRIBUTES oa;
    NTSTATUS opn, wrt;
    IO_STATUS_BLOCK isb;
    HANDLE hFile;

    DbgPrint("Start Writing\n\n");
    DbgPrint("File: %s", str);

    InitializeObjectAttributes(&oa, &nFile, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);

    opn = ZwOpenFile(&hFile, FILE_WRITE_DATA | SYNCHRONIZE, &oa, &isb,
    FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);
    if(opn == STATUS_SUCCESS)
    {
    DbgPrint("OpenFile...YES");
    wrt = ZwWriteFile(hFile, 0, NULL, NULL, &isb, &str, sizeof(str), NULL, NULL);
    if(wrt == STATUS_SUCCESS)
    {
    DbgPrint("ZwWriteFile...YES");
    }
    else
    {
    DbgPrint("ZwWriteFile...NO");
    }
    ZwClose(hFile);
    }
    else
    {
    DbgPrint("OpenFile...NO");
    }
    }

    А вот кусок кода ее вызова из другой функции:
    Код: (cpp)
    //.......
    p = (PVOID)ExAllocatePool(PagedPool, cd);
    if(p)
    {
    DbgPrint("ExAllocatePool...YES");
    }
    else
    {
    DbgPrint("ExAllocatePool...NO");
    }
    //.......
    WrtFile(nFile, p);
    ExFreePool(p);
    //.......
    Передача данных из функции в функцию происходит без проблем, а вот запись уже немного хандрит :)
  • Здравствуйте уважаемые программисты. Хочу научиться программировать драйвера. Вот учусь :) Возникли вопросы, с которыми мне одному не разобраться. Необходимо прочитать параметр из реестра. Вот мои наработки:
    Код: (cpp)
    #include <ntddk.h>

    VOID ReadUserinit()
    {
    UNICODE_STRING key;
    UNICODE_STRING param;
    OBJECT_ATTRIBUTES ObjAtr;
    HANDLE hKey;
    NTSTATUS opn, rd;
    PKEY_VALUE_PARTIAL_INFORMATION info;
    LONG size;

    DbgPrint("Start");

    RtlInitUnicodeString(&key, L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
    RtlInitUnicodeString(&param, L"Userinit");

    InitializeObjectAttributes(&ObjAtr, &key, OBJ_CASE_INSENSITIVE, NULL, NULL);

    opn = ZwOpenKey(&hKey, KEY_QUERY_VALUE, &ObjAtr);

    if(opn == STATUS_SUCCESS)
    {
    DbgPrint("ZwOpenKey()...YES");
    rd = ZwQueryValueKey(hKey, &param, KeyValuePartialInformation, NULL, 0, &size);
    if(rd == STATUS_SUCCESS)
    {
    DbgPrint("ZwQueryValueKey(1)...YES");
    info = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, size);
    rd = ZwQueryValueKey(hKey, &param, KeyValuePartialInformation, info, sizeof(KEY_VALUE_PARTIAL_INFORMATION), &size);
    if(rd = STATUS_SUCCESS)
    {
    DbgPrint("ZwQueryValueKey(2)...YES");
    DbgPrint("Parametr: %s", info);
    }
    else
    {
    DbgPrint("ZwQueryValueKey(2)...NO");
    }
    ExFreePool(info);
    }
    else
    {
    DbgPrint("ZwQueryValueKey(1)...NO");
    }
    ZwClose(hKey);
    }
    else
    {
    DbgPrint("ZwOpenKey()...NO");
    }
    }

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    {
        DbgPrint("Loaded");
        ReadUserinit();
        return STATUS_DEVICE_CONFIGURATION_ERROR;
    }
    При запуске драйвера и отладке программой DbgView, выполнение драйвера прекращается при первом вызове функции ZwQueryValueKey() т. е. DbgView выводит "ZwQueryValueKey(1)...NO" и далее, разумеется, ничего не работает. Прошу объяснить мне, где я не прав.
  • Направления программирования :: Web :: HTML/DHTML
  • Можно ли для окошка выбора файла для INPUT type="file" как-нибудь задать маску или фильтр по умолчанию, отличный от *.*?

    P.S. Интересует IE последних версий.
  • Учимся программировать :: Начинающим
  • Посоветуйте пожалуйста, библиотеку с реализацией хеширования файла (блока данных ) для С.
  • Какие знания можно получить на курсах С++

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


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


В избранное