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

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск № 22


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск      : 22
Подписчиков : 1555
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
От ведущего

Здравствуйте уважаемые подписчики !

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

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

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

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

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 87 ( made )

Здравствуйте, помогите пожалуйста с использованием API функции
SetWindowsHook, из описания на английском я понял, что в нее следует
передать четыре параметра, с первыми двумя все понятно, непонятно с
остальными. И еще какие значения она возвращает и возвращает ли вообще. Мне
конкретно нужна системная ловушка для отслеживания нажатия клавиш
клавиатуры - где ловить коды нажатых клавиш. Заранее благодарен!

Ответить на вопрос

Вопрос № 88 ( Валера )

Привет!
Подскажите, как написать код на C++ Builder.
Чтобы программа могла запускать любой документ, например,
doc, htm, xls, и пр.
А также можно было контролировать закрыт документ или нет?
И можно закрывать документ самостоятельно из этой проги.
Заранее благодарен.

Ответить на вопрос

Вопрос № 89 ( Валера )

Есть ли какие-нибудь компоненты под С++ Builder, которые работали с
таблицами как в Excel. Или просто могли представлять данные ввиде
таблиц, т.е. задача такая - каждая запись это таблица.
Спасибо.

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 84 ( Lenin )

здравствуйте
у меня возник такой вопрос:
как произвести поиск файла в текущей папке.
когда я пишу _findfirst("*.*",0) windows при запуске программы ругается,
что память не может быть written.В чем ошибка или скажите, может есть
какая другая функция

Ответ ( Шматко А.А. )

Не понял, как ты собрался получать информацию о найденных файлах. Функция
_findfirst() вторым параметром (у тебя 0) принимает указатель на структуру
_finddata_t. Разумеется, когда _findfirst() пытается записать по нулевому
указателю, возникает исключение, о котором ты и сообщаешь. Вот полный
прототип этой функции:

intptr_t _findfirst(const char *filespec, struct _finddata_t 
*fileinfo);

Первый параметр - маска файлов. Второй - указатель на структуру, куда при
успешном поиске помещается информация о первом найденном файле. Функция
возвращает некий HANDLE (-1 при ошибке и выставляет errno в ENOENT, если не
найдено ни одного соответсвтия или EINVAL при неправильном первом параметре,
например, "some.dat" - символы <> в именах фалов запрещены), который
нужно запомнить.
Для поиска всех следующих файлов используется функция (вызываемая
неоднократно для каждого следующего файла до тех пор, пока не будет сообщено
об ошибке)

int _findnext(intptr_t handle, struct _finddata_t *fileinfo);

которой первым параметром передаётся то же самый HANDLE, который вернул
соответствующий вызов _findfirst(), вторым параметром - опять-таки указатель
на структуру, которая при успешном вызове зополняется информацией о
следующем найденном файле. Эта функция возвращает 0 при успехе и -1 при
ошибке, при этом errno выставляется в ENOENT.
В конце (кроме случая, когда -1 возвращается самым первым вызовом
_findfirst()) необходимо освободить занятые этими функциями ресурсы вызовом

int _findclose(intptr_t handle);

где в качестве параметра передаётся тот же самый HANDLE.
Структура _finddata_t имеет формат:

struct _finddata_t
{
  unsigned attrib;          // атрибуты файла
  time_t   time_create;     // время создания (-1L для
                            // FAT-томов)
  time_t   time_access;     // время последнего доступа
                            // (-1L для FAT-томов)
  time_t   time_write;      // время последней модификации
  _fsize_t size;            // размер файла в байтах
  char     name[_MAX_PATH]; // строка с полным (без
                            // заполнителей * и ?)
                            // именем файла без пути
};

Константа _MAX_PATH определяет максимальную длину файла и определена в
STDLIB.H.
Атрибуты файла возвращаются как битовая маска (одновременно могут быть
установлены несколько, поэтому наличие/остутсвие атрибутов должно
проверяться типа как (data.attrib & _A_SUBDIR)!=0) или подобным образом)
следующих констант:

    _A_ARCH    "архивный"
    _A_HIDDEN  "скрытый"
    _A_NORMAL  "нормальный" (единственный, который не битовая
               маска; означает отсустсвие других арибутов;
               должен проверяться простым сравнением
               (data.attrib != _A_NORMAL))
    _A_RDONLY  "только чтение"
    _A_SUBDIR  "каталог" (да, это тоже атрибут)
    _A_SYSTEM  "системный"

Надеюсь, достаточно?
Вопрос № 85 ( Алексей Лебедев )

У меня к вам вопрос. Как добавить иконки в список. То есть, я создаю список:

if (!m_wndIBTree.Create(WS_CHILD|WS_VISIBLE|
           TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
           CRect(0, 0, 0, 0), &m_wndInstantBar, 100))
   {
       TRACE0("Failed to create instant bar child\n");
       return -1;              // fail to create
   }
   m_wndIBTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
        
   // bring the tooltips to front
   CWnd* pTT = FromHandle((HWND)
                   m_wndIBTree.SendMessage(TVM_GETTOOLTIPS));
   if (pTT != NULL)
       pTT->SetWindowPos(&wndTopMost, 0, 0, 0, 0,
       SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);

Мне необходимо добавить в этот список к каждому его элименту иконку (картинку в формате bmp). Вот такой вопрос.

Ответ ( 3V )

Очевидно, надо создать Image List, загрузить в него изображения, а потом при добавлении в дерево элементов (CTreeCtrl::InsertItem) указывать индекс изображения. В прототипах методов:

HTREEITEM InsertItem(
   UINT nMask,
   LPCTSTR lpszItem,
   int nImage,
   int nSelectedImage,
   UINT nState,
   UINT nStateMask,
   LPARAM lParam,
   HTREEITEM hParent,
   HTREEITEM hInsertAfter 
);

HTREEITEM InsertItem(
   LPCTSTR lpszItem,
   int nImage,
   int nSelectedImage,
   HTREEITEM hParent = TVI_ROOT,
   HTREEITEM hInsertAfter = TVI_LAST
);

класса CTreeCtrl параметр nImage - индекс изображения элемента, nSelectedImage - индекс изображения выделенного элемента.

или можно уже добавленному элементу задать изображение: SetItemImage

То есть в вышепреведенном случае что то типа:

в h-файле (в декларации класса):

...
CImageList m_imageList;
 ...

далее:

if (!m_wndIBTree.Create(WS_CHILD|WS_VISIBLE|
             TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
             CRect(0, 0, 0, 0), &m_wndInstantBar, 100))
     {
             TRACE0("Failed to create instant bar child\n");
             return -1;              // fail to create
     }
     m_wndIBTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);

m_imageList.Create(IDB_BITMAP1, 16, 1, RGB(255, 255, 0));
// ^^^ здесь IDB_BITMAP1 - ID битмапа в ресурсах.

m_wndIBTree.SetImageList(&m_imageList, TVSIL_NORMAL);

m_wndIBTree.InsertItem("Item 1", 0, 0);
// 0 и 0 - индексы картинок
Вопрос № 86 ( Aleksandr Zakharov )

Здравствуйте,

стоит задача разработать утилиту для изменения и добавления текстовых ресурсов в ресурсном DLL. Подскажите пожалуйста, существует ли решение такой задачи, на уровне администратора приложения, без перекомпиляции библиотеки? Я ищу решение без использования .NET-технологий. Таково требование :)

Заранее благодарен за ответ или ссылки на решение проблемы. Может быть есть примеры реализации.

Ответ ( 3V )

Если я понял задачу правильно (надо написать утилиту, чтобы правила ресурсы в модулях PE формата), то вполне логично воспользоваться API функциями типа:

BeginUpdateResource
UpdateResource
EndUpdateResource

FindResource
FindResourceEx 

А также можно посмотреть раздел "Resource Functions" в MSDN (в документации SDK).
Книги по C/C++
Самоучитель C++ Builder (+ CD-ROM)
Самоучитель C++ Builder (+ CD-ROM)

Автор: Никита Культин

Книга является руководством по программированию в среде Borland C++ Builder.

В ней рассматривается весь процесс разработки программы - от компоновки диалогового окна и написания функций обработки событий до отладки и создания справочной системы при помощи программы Microsoft HTML Help Workshop и установочного CD-ROM в InstallShield Express, разбираются вопросы работы с графикой, мультимедиа и базами данных, приведено описание процесса создания анимации в Macromedia Flash 5.

Прилагаемый к книге компакт-диск содержит проекты, приведенные в издании в качестве примеров.

Страница книги на Озоне
Язык программирования С++. Специальное издание
Язык программирования С++. Специальное издание

Автор: Бьерн Страуструп

Книга написана Бьерном Страуструпом - автором языка программирования C++ - и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный объектно-ориентированный подход к созданию программных продуктов.

Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++.

Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток.

Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка "из первых рук".

Страница книги на Озоне
Всего доброго. До встречи в следующем номере.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Отписаться

В избранное