Программирование >>  Арифметические и логические операции 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 53


При изучении файла 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



1 ... 30 31 32 [ 33 ] 34 35 36 ... 53

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