|
Программирование >> Перегруженные имена функций и идентификаторы
Но в данном случае вы получите неоправданное замедление из-за лишнего межзадачного взаимодействия, а в случае 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)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |