Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Доступ к серверу 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; просмотров: 400.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...