Студопедия

КАТЕГОРИИ:

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

Доступ к серверу SolidWorks 2003 с помощью интеллектуальных указателей




Вот пример консольного приложения, в котором интеллектуальные указатели используются для доступа к серверу SolidWorks. Имя проекта в приведенном примере – SWSmartPtr (см. примеры приложений в каталоге LabPrakt\STIP). Естественно, что в заголовочный файл stdafx.h надо включить директиву import:

// …

#include <afx.h>

#include <afxwin.h>    // MFC core and standard components

#include <afxext.h>    // MFC extensions

#import "Sldworks.tlb" no_namespace

#ifndef _AFX_NO_OLE_SUPPORT

// …

 

Листинг файла SWSmartPtr.cpp.

 

// SWSmartPtr.cpp

#include "stdafx.h"

#include "SWSmartPtr.h"

#include "Conio.h"

//другие директивы препроцессора

CWinApp theApp;

using namespace std;

Struct OleInit

{ OleInit() {CoInitialize(NULL);}

~OleInit() {CoUninitialize(); }

} Init;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0;

// инициализация MFC

try

{   

       //получение первого интерфейса

   ISldWorksPtr SldWorks("SldWorks.Application");

   VARIANT_BOOL Vis=TRUE;

// Делаем главное окно SolidWorks видимым

   SldWorks->put_Visible(Vis);

   /*В этот момент окно приложения SolidWorks должно появиться

на экране. В это место программы мы должны поместить вызовы

  требуемых функций SolidWorks*/

   cout<<"Press any key to stop SolidWorks"<<endl;

   getch();

   SldWorks->ExitApp();// завершение работы SolidWorks

   cout<<"Press any key to exit";

   nRetCode=0; getch();

}

catch(_com_error &ex)

{   /* вывод сообщения об ошибке*/

   char *Mess=new char [strlen(ex.ErrorMessage())+1];

   CharToOem(ex.ErrorMessage(),Mess);

   cerr<<Mess<<endl;

   delete Mess;// освобождение памяти

   nRetCode=1;

}

return nRetCode;

}

СОМ-объект, связанный с интеллектуальным указателем, освобождается после присваивания указателю значения NULL или после уничтожения указателя, например, когда поток выполнения программы выходит из области видимости описания указателя. Что из этого следует? Нельзя вызывать функцию CoUninitialize() до того момента времени, когда имеется хотя бы один не освобожденный указатель. Другими словами, вызывайте CoUninitialize() перед завершением работы приложения. А если этого не сделать? Получим исключительную ситуацию, возникающую при попытке вызвать для указателя на интерфейс метод Release() интерфейса IUnknown – можете проверить. В приведенном выше примере нам эти проблемы не страшны, так как мы используем глобально описанную структуру OleInit.

Если Вы ошибетесь в написании имени сервера (в определении указателя ISldWorksPtr SldWorks("SldWorks.Application");) или в системе не будет установлено приложение SolidWorks, то получите сообщение об ошибке «Недопустимая строка с указанием класса» благодаря тому, что определение указателя помещено в блок обработки исключительной ситуации try-catch.

Какая версия SolidWorks будет вызвана на выполнение, если, например, в системе установлено несколько версий SolidWorks? Для того чтобы определить эту самую версию, запустите программу Regedit.exe, запустите поиск значения параметра «SldWorks» и Вы узнаете  соответствующую версию, например, увидите значение «SldWorks 2003 Application» (рис. 1).

 

 

 Рис. 1. Ветвь реестра, содержащая сведения о сервере SolidWorks

 

Значения параметров ветви реестра, содержащей сведения о сервере SolidWorks, следующие:

LocalServer32= d:\PROGRA~1\SOLIDW~1\sldworks.exe

ProgID= SldWorks.Application.11

TypeLib= {83A33D31-27C5-11CE-BFD4-00400513BB57}

VersionIndependentProgID= SldWorks.Application

 

Для использования конкретной версии SolidWorks надо указать в качестве параметра конструктора интеллектуального указателя значение параметра ProgID, который хранит зависимое от версии имя сервера (в отличие от VersionIndependentProgID):

ISldWorksPtr SldWorks("SldWorks.Application.11");

 

Можно, конечно, поступить и так, как в приведенной выше программе, а именно без указания версии:

ISldWorksPtr SldWorks("SldWorks.Application");

 

Аналогичным образом дело обстоит и с подключением любых других серверов с помощью интеллектуальных указателей.

Если какой-либо метод СОМ-объекта требует параметр типа OleVariant, то в качестве соответствующего фактического параметра можно использовать класс COleVariant, объявленный в afxdisp.h, например:

COleVariant Res;

HRESULT hr=Ptr->SomeMethod(12,34,&Res);

cout<<Res.dblVal<<endl;  /* dblVal – интерпретация содержимого Res как имеющего

                                 тип double */

Еще лучше использовать вместо COleVariant класс CComVariant, имеющий большее число конструкторов и операций.










Последнее изменение этой страницы: 2018-04-12; просмотров: 381.

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