Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 153 154 155 [ 156 ] 157 158 159 ... 210


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

WorksheetPtr sheet = book->Worksheets->Item[1L]; sheet->Range[ B2 ]->FormulaR1C1 = Строка 1 ; sheet->Range[ C2 ]->FormulaR1C1 = 12345; При работе с MS Office максимально используйте возможности VBA для подготовки и тестирования вашего кода.

Будьте внимательны с версиями библиотек типов. К примеру, в MS Word 2000 появилась новая версия метода Run. Старая тоже осталась, но она имеет теперь название RunOld. Если вы используете MS Word 2000 и вызываете метод Run, то забудьте о совместимости с MS Word 97 - метода с таким ID в MS Word 97 просто нет. Используйте вызов RunOld и проблем не будет, хотя если очень хочется можно всегда проверить номер версии MS

Word.

Бывают глюки. Сразу заметим, что это не связано с самой директивой #import. Например, при использовании класса COleDispatchDriver с MSADODC.OCX всё прекрасно работало, а после того как стали использовать директиву #import, свойство ConnectionString отказалось возвращать значение. Дело в том, что директива #import генерирует обёртку, используя dual-интерфейс объекта, а класс COleDispatchDriver вызывает ConnectionString через IDispatch::Invoke. Ошибка, видимо, в реализации самого MSADODC.OCX. После изменения кода вызова свойства всё заработало:

inline bstr t IAdodc::GetConnectionString () {

BSTR result;

HRESULT hr = com dispatch propget(this,0x01,VT BSTR,& result); HRESULT hr = get ConnectionString(& result);

if (FAILED( hr)) com issue errorex( hr, this, uuidof(this));

return bstr t( result, false);

В результате раскрутки библиотек типов MS Office, компилятор нагенерирует вам в выходной каталог проекта около 12 Mb исходников. Всё это он потом, естественно, будет компилировать. Если вы не являетесь счастливым обладателем



PIII, то наверняка заметите некоторые тормоза. В таких случаях надо стараться выносить в отдельный файл всю работу, связанную с подобными библиотеками типов. Кроме того, компилятор может генерировать обёртки классов каждый раз после внесения изменений в файл, в который включена директива #import. Представьте, что будет, если после каждого нажатия клавиши будут заново генерироваться все 12 Mb? Лучше вынести объявление директивы #import в отдельный файл и подключать его через #include.

Удачи в бою.

Создание системных ловушек Windows на Borland C++ Builder 5

Для начала определим, что именно мы хотим сделать.

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

Предполагается, что такая программа должна иметь небольшой размер. Поэтому будем писать её с использованием только WIN API.

Понятие ловушки

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

Для обработки сообщений пишется специальная функция (Hook Procedure). Для начала срабатывания ловушки эту функцию следует специальным образом подключить к системе.

Если надо отслеживать сообщения всех потоков, а не только текущего, то ловушка должна быть глобальной. В этом случае функция ловушки должна находиться в DLL.

Таким образом, задача разбивается на две части:

Написание DLL c функциями ловушки (их будет две: одна для клавиатуры, другая для мыши).

Написание приложения, которое установит ловушку.



Написание DLL.

Создание пустой библиотеки.

С++ Builder имеет встроенный мастер по созданию DLL. Используем его, чтобы создать пустую библиотеку. Для этого надо выбрать пункт меню File <> New: В появившемся окне надо выбрать DLL Wizard и нажать кнопку OK . В новом диалоге в разделе Source Type следует оставить значение по умолчанию - C++ . Во втором разделе надо снять все флажки. После нажатия кнопки Ок пустая библиотека будет создана.

Глобальные переменные и функция входа (DllEntryPoint)

Надо определить некоторые глобальные переменные, которые понадобятся в дальнейшем.

#define UP 1 Состояния клавиш

#define DOWN 2 #define RESET 3

int iAltKey; Здесь хранится состояние клавиш int iCtrlKey;

int iShiftKey;

int KEYBLAY; Тип переключения языка

bool bSCRSAVEACTIVE; Установлен ли ScreenSaver

MOUSEHOOKSTRUCT* psMouseHook; Для анализа сообщений от

мыши

В функции DllEntryPoint надо написать код, подобный нижеприведённому:

if(reason==DLL PROCESS ATTACH) Проецируем на адр. простр.

HKEY pOpenKey;

char* cResult= ; Узнаём как перекл. раскладка

long lSize=2; KEYBLAY=3;

if(RegOpenKey(HKEY USERS, .Default\\keyboard layout\\toggle , &pOpenKey)==ERROR SUCCESS)

RegQueryValue(pOpenKey, ,cResult,&lSize); if(strcmp(cResult, 1 )==0)



1 ... 153 154 155 [ 156 ] 157 158 159 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика