Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000392.doc
Скачиваний:
18
Добавлен:
30.04.2022
Размер:
2.94 Mб
Скачать

1. Создание проектов прикладных библиотек

КОМПАС В СРЕДЕ VISUAL C++

Создать прикладную библиотеку и подготовить ее к работе в системах КОМПАС v10-11 можно двумя способами: воспользоваться мастером создания библиотек Visual C++ 6.0 или изменить имеющиеся в директории «..\SDK\C++\ Visualc», рабочие проекты прикладных библиотек.

Создание шаблона библиотеки при помощи мастера создания библиотек (Wizard), разработанного специалистами системы КОМПАС, производится легко - достаточно следовать инструкциям разработчика. Для подключения мастера создания библиотек необходимо скопировать файл LibraryWizard.awx в директорию «C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Template» или в папку Template аналогичной директории куда установлен MS Visual C++ 6.0.

После подключения мастера создания библиотек в окне нового проекта появиться новый пункт LibraryWizard. Пути к заголовкам библиотек (Include директориям) в опциях нового проекта по умолчанию настроены для папки «..\SDK\C++\Visualc», поэтому при создании проекта необходимо указать этот путь в location (рис. 1).

Рис. 1. Мастер создания прикладных библиотек системы КОМПАС в Visual C++ 6.0

Используя опции генератора данных, мастер подготовит проект подключаемой для системы КОМПАС динамической библиотеки в среде Visual С++.

Пример кода динамически подключаемой прикладной библиотеки с именем FirstWizardLibraryProject представлен на листинге:

#include "stdafx.h"

#include <afxdllx.h>

#include "FirstWizardLibraryProject.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

//Специальная структура используемая в течении инициализации DLL

static AFX_EXTENSION_MODULE FirstWizardLibraryProjectDLL = { NULL, NULL };

HINSTANCE g_hInstance = NULL;

//Стандартная точка входа

//Инициализация и завершение DLL

extern "C" int APIENTRY

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

{

g_hInstance = hInstance;

if (dwReason == DLL_PROCESS_ATTACH)

{

TRACE0("FIRSTWIZARDLIBRARYPROJECT.AWX Initializing!\n");

AfxInitExtensionModule(FirstWizardLibraryProjectDLL, hInstance);

new CDynLinkLibrary(FirstWizardLibraryProjectDLL);

}

else if (dwReason == DLL_PROCESS_DETACH)

{

TRACE0("FIRSTWIZARDLIBRARYPROJECT.AWX Terminating!\n");

AfxTermExtensionModule(FirstWizardLibraryProjectDLL);

}

return 1; }

// Задать идентификатор ресурсов

unsigned int WINAPI LIBRARYID()

{ return IDR_LIBID;

}

// Головная функция библиотеки

void WINAPI LIBRARYENTRY( unsigned int comm )

{ switch ( comm )

{ case 1:

{ // Выдача сообщения пользователю

MessageT( _T("Тестовая команда 1") );

break;

}

}

}

// Загрузить строку из ресурса

CString LoadStr( int strID )

{TCHAR temp[_MAX_PATH];

LoadString( FirstWizardLibraryProjectDLL.hModule, strID, temp, _MAX_PATH );

return temp;

}

Для успешной компиляции и создания рабочего модуля библиотеки необходимо в файле «StdAfx.h» удалить или внести в статус комментариев следующие строки, как показано в тексте программы и подключить заголовки (headers) c системными библиотеками (lib) SDK в среде Visual C++ «Tools->Options->Directories» и в разделе «Show directories for: Include files (Library files)» указать путь к соответствующим файлам (рис. 2).

#if !defined(AFX_STDAFX_H__B043E8EF_8214_4064_99A2_47EED4F276FA__INCLUDED_)

#define AFX_STDAFX_H__B043E8EF_8214_4064_99A2_47EED4F276FA__INCLUDED_

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

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

#include <afxext.h> // MFC extensions

#include <afxcmn.h> // MFC support for Windows 95 Common Controls

#include <COMUTIL.H>

#include <comdef.h>

#pragma warning( disable : 4192 )

// Закомментировать или удалить!!!

//#import "..\..\..\lib\ksConstants.tlb" no_namespace named_guids

//#import"..\..\..\lib\ksConstants3D.tlb"no_namespace named_guids

//#import "..\..\..\lib\kAPI2D5COM.tlb" no_namespace named_guids

//#import "..\..\..\lib\kAPI3D5COM.tlb" no_namespace named_guids

#include <libtool.h>

#include <LHead3d.h>

#pragma warning( once : 4192 )

#endif

//!defined(AFX_STDAFX_H__B043E8EF_8214_4064_99A2_47EED4F276FA__IN//CLUDED_)

Рис. 2. Подключение заголовков и прикладных библиотек системы КОМПАС в Visual C++

При «ручном» способе разработки прикладных библиотек может потребоваться внесение некоторых модулей из папки «..SDK\Lib» непосредственно в дерево построения проекта (WorkSpace) (рис. 3). При сборке библиотеки имеется возможность воспользоваться опциями управления проекта (Project->Settings->C++&Links& Resources) для изменения производительности программного кода, обеспечения его компактности, включения в раздел ресурсов национальной таблицы символов, отличных от латинских, изменение имени конечного файла (рис. 4). При окончательной сборке библиотеки необходимо поменять в опции «Активная конфигурация» режим «Debug» на «Release»-это действие приведет к уменьшению объема выходного файла динамически подключаемого приложения за счет удаления отладочной информации о проекте (Build->Set Active Configuration).

Рис. 3. Включение в проект файлов kAPI2D5.lib и kAPI3D5.lib для работы с чертежами и моделями

Рис. 4. Настройки проекта: изменение имени файла прикладной библиотеки

Из приведенного выше примера большая часть кода представлена системным механизмом проектирования приложений, в котором реализованы общие принципы построения динамически подключаемых библиотек посредством технологии СОМ - наиболее широко используемой объектной модели для разработки рассредоточенных и действующих одновременно систем. Особый интерес представляет основная функция прикладной библиотеки, представленная на листинге ниже, выводящее сообщение на экран.

void WINAPI LIBRARYENTRY( unsigned int comm )

{ switch ( comm )

{

case 1:

{

//Выдача сообщения пользователю

MessageT( _T("Тестовая команда 1") );break;

}

}

}

В функцию WINAPI LIBRARYENTRY включен множественный оператор выбора switch(), по которому можно организовать вызов отдельного набора команд, составленных на языке С++ и API системы КОМПАС, функций, членов классов, структур, шаблонов, включения ассемблерных вставок и т.д.

Пример ассемблерного кода по расчету факториала:

void WINAPI LIBRARYENTRY( unsigned int comm )

{ TCHAR buf [255];

WORD iii;

__asm

{ mov ax,1

xor bx,bx

mov cx,8

label1:

inc bx

mul bx

loop label1

mov iii,ax };

_stprintf( buf, _T("Factorial = %d"), iii );

MessageT( buf );

}

Сообщение выводиться на экран по команде «MessageT(_T("Тестовая команда 1"));», где каждый символ представлен двухбайтовым значением и соответствует национальной таблице символов в Unicode. Использование Unicode требует коррекции функций и типов переменных как минимум в функциях, использующих MFC.

Строковые константы в коде необходимо окружить дефайном

_T, например: «char str[100]=“”;» заменяется на «TCHAR str[100]=_T(“”);». Таким образом, проект можно будет компилировать под Компас 10 в Unicode. В случае разработки библиотек под систему Компас 9 надо переключиться на неюникодную конфигурацию.

Потребуется замена вызова неюникодных функций, работающих со строками на объявления, которые в зависимости от типа компиляции заменяются на юникодный или неюникодный аналог функции. Например: strcmp strcpy atof. Данные функции в местах, где будет использоваться TCHAR*, заменить на объявления из файла TCHAR.h. Примеры замен необходимо уточнить в документации.

Вывод текстовых сообщений может быть выполнен не только с помощью специфического API КОМПАС, но и средствами разработки WinAPI, MFC, которые реализованы в интегрированной среде Visual C++:

Пример:

MessageBox(NULL,_T("Сообщение"),_T("Пример вывода"),MB_OK);

AfxMessageBox(_T("Сообщение"),MB_ICONINFORMATION ,0);

Для того чтобы перевести текст программы в машинный код, необходимо выполнить компиляцию проекта, выбрав опцию «Build» в меню интегрированной среды, или нажать функциональную клавишу F7. Полученный файл с расширением .rtw можно подключить в окне менеджера библиотек Компас путем добавления описания прикладной библиотеки, как показано на рис. 5.

Рис. 5. Подключение разработанной прикладной библиотеки в окне менеджера библиотек Компас