|
Программирование >> Арифметические и логические операции
При изучении файла sampl.tli хорошо видно как директива #import генерирует исключения. Это происходит всегда при выполнении следующего условия: if (FAILED( hr)) com issue errorex( hr, this, uuidof(this)); Этот способ, безусловно, является универсальным, но могут возникнуть некоторые неудобства. Например, метод MoveNext объекта Recordset ADO возвращает код, который не является ошибкой, а лишь индицирует о достижении конца набора записей. Тем не менее, мы получим исключение. В подобных случаях придётся использовать либо вложенные операторы try {} catch, либо корректировать wrapper, внося обработку исключений непосредственно в тело сгенерированных процедур. В последнем случае, правда, придется подключать файлы *.tlh уже обычным способом, через #include. Но делать это никто не запрещает. Наконец, настало время рассмотреть несколько практических примеров. Приведем четыре примера работы с MS Word, MS Excel, ADO DB и ActiveX Control. Первые три примера будут обычными консольными программами, в последнем примере покажем, как можно заменить класс COleDispatchDriver сгенерированный MFC Class Wizardом на классы полученные директивой #import. Для первых двух примеров нам понадобится файл следующего содержания: Office.h #define Uses MSO2000 #ifdef Uses MSO2000 for MS Office 2000 #import C:\Program Files\Microsoft Office\Office\MSO9.DLL #import C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB #import C:\Program Files\Microsoft Office\Office\MSWORD9.OLB \ rename( ExitWindows , ExitWindows ) #import C:\Program Files\Microsoft Office\Office\EXCEL9.OLB \ rename( DialogBox , DialogBox ) \ rename( RGB , RGB ) \ exclude( IFont , IPicture ) #import C:\Program Files\Common Files\Microsoft Shared\DAO\DAO360.DLL \ rename( EOF , EndOfFile ) rename( BOF , BegOfFile ) #import C:\Program Files\Microsoft Office\Office\MSACC9.OLB #else for MS Office 97 #import C:\Program Files\Microsoft Office\Office\MSO97.DLL #import C:\Program Files\Common Files\Microsoft Shared\VBA\VBE-EXT1.OLB #import C:\Program Files\Microsoft Office\Office\MSWORD8.OLB \ rename( ExitWindows , ExitWindows ) #import C:\Program Files\Microsoft Office\Office\EXCEL8.OLB \ rename( DialogBox , DialogBox ) \ rename( RGB , RGB ) \ exclude( IFont , IPicture ) #import C:\Program Files\Common Files\Microsoft Shared\DAO\DAO350.DLL \ rename( EOF , EndOfFile ) rename( BOF , BegOfFile ) #import C:\Program Files\Microsoft Office\Office\MSACC8.OLB #endif Этот файл содержит подключение библиотек типов MS Word, MS Excel и MS Access. По умолчанию подключаются библиотеки для MS Office 2000, если на вашем компьютере установлен MS Office 97, то следует закомментировать строчку: #define Uses MSO2000 Если MS Office установлен в каталог, отличный от C:\Program Files\Microsoft Office\Office\ , то пути к библиотекам также следует подкорректировать. Обратите внимание на атрибут rename, его необходимо использовать, когда возникают конфликты имён свойств и методов библиотеки типов с препроцессором. Например, функция ExitWindows объявлена в файле winuser.h как макрос: #define ExitWindows(dwReserved,Code) ExitWindowsEx(EWX LOGOFF,0xFFFFFFFF) В результате, там, где препроцессор встретит имя ExitWindows, он будет пытаться подставлять определение макроса. Этого можно избежать при использовании атрибута rename, заменив такое имя на любое другое. MS Word console.cpp : Defines the entry point for the console application. #include #include #include stdafx.h <stdio.h> Office.h void main() ::CoInitialize(NULL); try { using namespace Word; ApplicationPtr word(L Word.Application ); word->Visible = true; word->Activate(); создаём новый документ DocumentPtr wdoc1 = word->Documents->Add(); пишем пару слов RangePtr range = wdoc1->Content; range->LanguageID = wdRussian; range->InsertAfter( Пара слов ); сохраняем как HTML wdoc1->SaveAs(& variant t( C:\\MyDoc\\test.htm ), & variant t(long(wdFormatHTML))); иногда придется прибегать к явному преобразованию типов, т.к. оператор преобразования char* в VARIANT* не определён открывает документ test.doc DocumentPtr wdoc2 = word->Documents->Open (& variant t( C:\\MyDoc\\test.doc )); вызываем макрос word->Run( Macro1 ); } catch ( com error& er) { char buf[1024]; sprintf(buf, com error:\n Error : %08lX\n ErrorMessage: %s\n Description : %s\n Source : %s\n , er.Error(), (LPCTSTR) bstr t(er.ErrorMessage()), (LPCTSTR) bstr t(er.Description()), (LPCTSTR) bstr t(er.Source())); CharToOem(buf,buf); только для консольных приложений printf(buf); ::CoUninitialize(); MS Excel console.cpp : Defines the entry point for the console application. #include stdafx.h #include <stdio.h> #include Office.h void main() ::CoInitialize(NULL); try { using namespace Excel; ApplicationPtr excel( Excel.Application ); excel->Visible[0] = true; создаём новую книгу WorkbookPtr book = excel->Workbooks->Add(); получаем первый лист (в VBA нумерация с единицы) WorksheetPtr sheet = book->Worksheets->Item[1L]; Аналогичная конструкция на VBA выглядит так: book.Worksheets[1] В библиотеке типов Item объявляется как метод или свойство по умолчанию (id[0]), поэтому в VB его можно опускать. На C++ такое, естественно, не пройдёт. заполняем ячейки sheet->Range[ B2 ]->FormulaR1C1 = Строка 1 ; sheet->Range[ C2 ]->FormulaR1C1 = 12345L; sheet->Range[ B3 ]->FormulaR1C1 = Строка 2 ; sheet->Range[ C3 ]->FormulaR1C1 = 54321L; заполняем и активизируем итоговую строку sheet->Range[ B4 ]->FormulaR1C1 = Итого: ; sheet->Range[ C4 ]->FormulaR1C1 = =SUM(R[-2]C:R[-1]C) ; sheet->Range[ C4 ]->Activate(); делаем красиво sheet->Range[ A4:D4 ]->Font->ColorIndex = 27L; sheet->Range[ A4:D4 ]->Interior->ColorIndex = 5L; Постфикс L говорит, что константа является числом типа long. Вы всегда должны приводить числа к типу long или short при преобразовании их к variant t, т.к. преобразование типа int к variant t не реализовано. Это вызвано не желанием разработчиков компилятора усложнить нам жизнь, а спецификой самого типа int. } catch ( com error& er) { char buf[1024]; sprintf(buf, com error:\n Error : %08lX\n ErrorMessage: %s\n Description : %s\n Source : %s\n , er.Error(), (LPCTSTR) bstr t(er.ErrorMessage()), (LPCTSTR) bstr t(er.Description()), (LPCTSTR) bstr t(er.Source())); CharToOem(buf,buf); только для консольных приложений printf(buf); ::CoUninitialize(); ADO DB console.cpp : Defines the entry point for the console application. #include stdafx.h #include <stdio.h> #import C:\Program Files\Common Files\System\ado\msado20.tlb \ rename( EOF , ADOEOF ) rename( BOF , ADOBOF ) оператор rename необходим, т.к. EOF определён как макрос в файле stdio.h using namespace ADODB; void main() ::CoInitialize(NULL); try { открываем соединение с БД ConnectionPtr con( ADODB.Connection ); con->Open(L Provider=Microsoft.Jet.OLEDB.3.51; L Data Source=Elections.mdb , , ,0); открываем таблицу RecordsetPtr rset( ADODB.Recordset ); rset->Open(L ElectTbl ,(IDispatch*)con, adOpenDynamic,adLockOptimistic,adCmdTable); FieldsPtr flds = rset->Fields; добавляем rset->AddNew(); f1ds->Item[L Фамилия ] ->Value = L Пупкин ; f1ds->Item[L Имя ] ->Value = L Василий ; f1ds->Item[L Отчество ] ->Value = L Карлович ; f1ds->Item[L Голосовал ли ] ->Value = false; f1ds->Item[L За кого проголосовал ] ->Value = L Против всех ; rset->Update(); подменяем f1ds->Item[L Голосовал ли ] ->Value = true; f1ds->Item[L За кого проголосовал ] ->Value = L За наших ; rset->Update(); просмотр rset->MoveFirst(); while (!rset->ADOEOF) { char buf[1024]; sprintf(buf, %s %s %s: %s - %s\n , (LPCTSTR) bstr t(f1ds->Item[L Фамилия ]->Va1ue), (LPCTSTR) bstr t(f1ds->Item[L Имя ]->Va1ue), (LPCTSTR) bstr t(f1ds->Item[L Отчество ]->Va1ue), (boo1)f1ds->Item[L Голосовал ли ]->Va1ue? Да : Нет , (LPCTSTR) bstr t(f1ds->Item[L За кого проголосовал ] ->Value)); CharToOem(buf,buf); printf(buf); rset->MoveNext(); } catch ( com error& er) { char buf[1024]; sprintf(buf, com error:\n Error : %08lX\n ErrorMessage: %s\n
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |