Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Доступ к серверу SolidWorks 2007 с помощью интеллектуальных указателей
Доступ к серверу SolidWorks 2007 из приложения, построенного в среде MVS-2008, практически такой же, как и рассмотренный в предыдущем подразделе, но некоторые отличия все же есть. Во-первых, удобнее импортировать, по крайней мере две библиотеки типов: SldWorks.tlb и SWConst.tlb. Соответственно, эти файлы удобнее скопировать в каталог проекта. Во-вторых, импорт этих библиотек надо сделать так (изменения выделены полужирным шрифтом): // Файл stdafx.h // … #include <afx.h> #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <atlbase.h> #import "sldworks.tlb" no_namespace raw_interfaces_only rename("IEntity", "SWEntity") #import "swconst.tlb" no_namespace #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
Код запуска сервера в простейшем случае может быть следующим: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure // … if(CoInitialize(NULL)!=S_OK) { cerr<<"OLE initializing error"<<endl; getchar(); return 1; } try { ISldWorksPtr SldWorks("SldWorks.Application"); VARIANT_BOOL Vis=true; SldWorks->put_Visible(Vis); cout<<"Press Enter to stop SolidWorks"; getchar(); SldWorks->ExitApp(); cout<<"Press Enter to exit"; getchar(); } catch(_com_error &ex) { char *Mess=new char [strlen(ex.ErrorMessage())+1]; CharToOem(ex.ErrorMessage(),Mess); cerr<<Mess<<endl; delete Mess; // освобождение памяти CoUninitialize(); getchar(); return 1; } CoUninitialize(); return nRetCode; }
Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из консольного приложения Доступ к серверу Microsoft Word с помощью интеллектуальных указателей значительно более сложен, чем, к примеру, доступ к SolidWorks. Главная проблема – это корректный импорт библиотеки, который зависит от установленной версии Microsoft Office. Приводимый ниже пример (см. проект WordSmartPtr в каталоге LabPrakt\STIP) работает в такой программной среде: · Windows XP Professional 2002 Service Park 2 · Microsoft Office Word 2003 Service Park 2 · Microsoft Visual Studio 6.0
Для другого программного окружения (других версий) понадобится, скорее всего, изменять файл StdAfx.h. Рекомендации для такого случая надо искать на форумах в Интернете. Последовательность создания приложения для приведенной выше программной платформы следующая. Шаг 1. Создайте консольное приложение с помощью мастера Win32 Console Application и включите поддержку MFC. Здесь предполагается, что имя проекта – WordSmartPtr. Шаг 2. Найдите на своем компьютере файлы msword.olb, mso.dll и vbe6ext.olb и скопируйте их в каталог проекта. Можно файлы и не копировать, но тогда надо указывать их полные имена (с путем) в директивах import. Файлы надо искать в папках: …\\Program Files\Microsoft Office\OFFICE11\ …\\Program Files\Common Files\Microsoft Shared\OFFICE11\
Обратите внимание на версию OFFICE11. Шаг 3. Теперь модифицируйте файл StdAfx.h, добавив в него директивы, выделенные в следующем листинге: // stdafx.h //… #include <afx.h> #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions ////////////////// начало вставок ///////////////////// #import "mso.dll" using namespace Office; #import "VBE6EXT.OLB" #import "MSWORD.OLB" rename("ExitWindows", "WordExitWindows"), rename("FindText", "WordFindText") ////////////////// конец вставок ///////////////////// #ifndef _AFX_NO_OLE_SUPPORT // …
Шаг 4. Текст файла с главной функцией отредактируйте в соответствии со следующим листингом (в данном примере проекту присвоено имя UseWordSPtr): // UseWordSPtr.cpp : иллюстрация взаимодействия с MS Word с помощью умных указателей #include "stdafx.h" #include "UseWordSPtr.h" #include <ConIO.h> #ifdef _DEBUG #define new DEBUG_NEW #endif CWinApp theApp; using namespace std; using namespace Word; struct OleInit { OleInit() { CoInitialize(NULL); } ~OleInit() { CoUninitialize(); } } Init;
void _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { _tprintf(_T("Fatal Error: MFC initialization failed\n")); return; } try { _ApplicationPtr pWord("Word.Application"); //получение первого интерфейса VARIANT_BOOL Vis=TRUE; pWord->PutVisible(Vis); // делаем окно Word видимым DocumentsPtr pDocs=pWord->GetDocuments(); /* получаем ссылку на объект Documents */ _DocumentPtr pDoc=pDocs->Add(); // создаем новый документ /* сохраняем документ под заданным именем*/ VARIANT FName; FName.vt=VT_BSTR; FName.bstrVal=SysAllocString(L"D:\\MyDoc.doc"); /* память надо выделять самостоятельно и не забывать освобождать */ pDoc->SaveAs(&FName); /////////////////////////////////////////// cout<<"Press any key to stop MS Word"<<endl; _getch(); VERIFY(pWord->Quit()==S_OK);// завершение работы Word SysFreeString(FName.bstrVal); // память надо освободить cout<<"Press any key to exit"; _getch(); } catch(_com_error &ex) { /* вывод сообщения об ошибке*/ char Buf[300]; WideCharToMultiByte(866,WC_NO_BEST_FIT_CHARS, ex.ErrorMessage(),-1,Buf,sizeof(Buf),0,0); cout<<Buf<<endl; _getch(); } }
Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из GUI-приложения Основное отличие реализации этого клиентского приложения от рассмотренного в предыдущем подразделе состоит в способе инициализации интеллектуальных указателей и их использования в методах какого-либо класса. В данном примере рассматривается случай использования клиенсткого приложения (MFC application) с архитектурой документ-представление (рис. 1).
Рис. 1. Каркас клиентского приложения
Для использования различных интерфейсов WinWord (версия Microsoft Office 2003) можно создать отдельный заголовочный файл Office.h с таким содержимым: // Office.h #define Uses_MSO2003 // for MS Office 2003 #import "C:\Program Files\Common Files\microsoft shared\OFFICE11\MSO.DLL" #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" #import "C:\Program Files\Microsoft Office\Office11\MSWORD.OLB" \ rename("ExitWindows","_ExitWindows") #import "C:\Program Files\Common Files\Microsoft Shared\DAO\DAO360.DLL" \ rename("EOF","EndOfFile") rename("BOF","BegOfFile")
Конечно, вы должны убедиться в том, что пути к файлам действительны для вашего случая. Этот файл надо включить в файл stdafx.h: // stdafx.h // … #include <afxext.h> // расширения MFC #include "Office.h" #include <afxdisp.h> // классы автоматизации MFC // …
Если вы присвоили проекту имя TestWord, то заголовочный файл класса вида будет иметь имя TestWordView.h. В нем надо описать интеллектуальный указатель на приложение WinWord и подключить пространство имен Word, так как объявление интерфейсов и методов объектов WinWord в файле ..\debug\msword.tlh заключено в это пространство имен: // TestWordView.h : интерфейс класса CTestWordView #pragma once using namespace Word; // !!!!!!!!! |
||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 461. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |