Использование директивы #import в Visual C++

ОГЛАВЛЕНИЕ

Заключение 

В заключении, позволю себе высказать ещё несколько замечаний.

  • Всегда внимательно изучайте файлы *.tlh. Отчасти они могут заменить документацию, а если её нет, то это единственный источник информации (кроме, конечно, OLE/COM Object Viewer).
  • Избегайте повторяющихся сложных конструкций. Например, можно написать так:
    book->Worksheets->Item[1L]->Range["B2"]->FormulaR1C1 = "Строка 1";
    book->Worksheets->Item[1L]->Range["C2"]->FormulaR1C1 = 12345L;
    Но в данном случае вы получите неоправданное замедление из-за лишнего межзадачного взаимодействия, а в случае DCOM - сетевого взаимодействия. Лучше написать так:
    _WorksheetPtr sheet = book->Worksheets->Item[1L];
    sheet->Range["B2"]->FormulaR1C1 = "Строка 1";
    sheet->Range["C2"]->FormulaR1C1 = 12345;
  • При работе с MS Office максимально используйте возможности VBA для подготовки и тестирования вашего кода. Приведённые примеры я сочинил за пару минут, просто включив запись макроса, после чего скопировал полученный код в свою программу, слегка оптимизировал его и адаптировал для C++. Например, я понятия не имел, что объект Range имеет свойство FormulaR1C1, тем не менее, я получил то, что хотел.
  • Будьте внимательны с версиями библиотек типов. К примеру, в MS Word 2000 появилась новая версия метода Run. Старая тоже осталась, но она имеет теперь название RunOld. Если вы используете MS Word 2000 и вызываете метод Run, то забудьте о совместимости с MS Word 97, метода с таким ID в MS Word 97 просто нет. Используйте вызов RunOld и проблем не будет, хотя если очень хочется можно всегда проверить номер версии MS Word.
  • Бывают глюки :o(. Сразу замечу, что это не связано с самой директивой #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.
Читайте также:
  • Работа с СУБД Oracle через интерфейс OCCI
    Принятые именования объектов Environment* env;Connection* conn;Statement* stmt;ResultSet* rs;SQLException &sqlExcp; Давайте рассмотрим пример небольшой тестовой программы использующей интерфейс OCCI:#include #include "occi.h"  using namespace std;using namespace oracle::occi;#defi...
  • Задача Майхилла для Microsoft Visual C++
    Алгоритм поведения и автоматная модель стрелка На первый окрик: "Кто идет?" - он стал шутить,На выстрел в воздух закричал: "Кончай дурить!"Я чуть замешкался и, не вступая в спор,Чинарик выплюнул - и выстрелил в упор.В. Высоцкий В задаче Майхилла необходимо определить, как нужно...
  • Использование ODBC в Visual C++
    Установка соединения Для работы необходимо включить описание функций, которые находятся в файле afxdb.h: // пример#include "afxdb.h" Для начала работы необходимо используя класс создать тект используя конструктор. В конструктор нет необходимости передавать параметры. После создания обье...
  • Создание простого приложения с плагинами
    Динамически подключаемые модули (DLL) - это модули, которые содержат функции и данные. Эти модули загружаются во время выполнения программы, использующей эти модули (хоста). В ОС Windows модули содержат внутренние и экспортируемые функции (в UNIX подобных системах все функции являются экспортируе...
  • Работа с 1C Предприятие из Visual C++
    1С Предприятие предоставляем пользователям механизм OLE DB. Если Вам вдруг захотелось использовать какие либо данные из 1С Предприятия в вашей программе – вы можете воспользоваться этим механизмом. Совсем просто это делается в таких языках, как Visual Basic или Delphi. В них вся работа с O...