---
title: "Builder C++"
type: guide
api: [api7]
tags: [guide, api7, compiling]
sources:
  - compiling_builder_c.html
---

*Компиляция библиотек*


## Builder C++

1.Задайте пути к подключаемым модулям. Для этого вызовите команды Project — Options… — Directories/Conditionals — Include path и Library path.
2.Отключите прежние файлы библиотек (файлы *.lib).
Возможность компиляции 64-разрядных библиотек есть в Embarcadero RAD Studio XE3 и выше.
Для 64-разрядной версии КОМПАС-3D требуется подключение файлов SDK\lib64\kAPI2D5bc.a, kAPI3D5bc.a.
Файлы архивов .а генерируются утилитой MKEXP.EXE:
MKEXP.EXE  kAPI2D5bc.a kAPI2D5.dll
Для использования API7 может потребоваться подключение файлов kAPI7bc.lib или kAPI7bc.а.
см. также:
http://forum.ascon.ru/index.php/topic,25560.20.html
http://docwiki.embarcadero.com/RADStudio/XE3/en/MKEXP.EXE,_the_64-bit_Windows_Import_Library_Tool_for_C%2B%2B
Рекомендуется вместо подключения в дереве сделать линковку библиотек через директиву #pragma:
#pragma comment(lib, "kAPI2D5bc")
#pragma comment(lib, "kAPI3D5bc")
В настройках проекта требуется добавить путь к каталогу SDK\lib64, см. пример в SDK\C++\CBuilder\step1
При адаптации библиотеки, созданной в старых версиях Borland C++ Builder для Embarcadero RAD Studio XE3 и выше, требуется открыть в блокноте и изменить значение параметра
<FrameworkType>None</FrameworkType> на <FrameworkType>VCL</FrameworkType>
При компиляции под x64 не работает директива __pascal. Требуется изменение функций.
Было:
extern "C" unsigned int far __pascal WINAPI LibraryId()
{
return IDR_LIBID;
}
extern "C" void far __pascal LibraryEntry( UINT comm )
Стало:
extern "C" unsigned int far __export WINAPI LIBRARYID()
{
return IDR_LIBID;
}
extern "C" void far __export WINAPI LIBRARYENTRY( UINT comm )
В x64 __export не работает для функций, возвращающих указатель на строку char * и wchar_t *. Требуется объявление как __declspec(dllexport):
extern "C" char * __declspec(dllexport) __stdcall LIBRARYNAME()
Нужно учитывать, что класс string стал Unicod-ным. Вместо него рекомендуется использовать классы AnsiString или Unicod-ный WideString.
В Embarcadero RAD Studio есть поддержка Unicod.
Рекомендуется выполнить перевод библиотеки на Unicod с использованием Unicod-ных аналогов структур и функций.


## Builder C++ Automation

1.Задайте пути к подключаемым модулям. Для этого вызовите команды Project — Options… — Directories/Conditionals — Include path и Library path.
2.Отключите прежние файлы библиотек (файлы *.lib).
Для 64-разрядной версии КОМПАС-3D требуется использовать файл kapi5bc.a.
Рекомендуется вместо подключения в дереве сделать линковку библиотек через директиву #pragma.
#pragma comment(lib, "kAPI5bc")
3.Удалите файлы ks_tlb.h, ks_tlb.cpp, ks_ocx.h, ks_ocx.cpp.
4.Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующие действия.
4.1. Вызовите команду Project — Import type library — Add.
В Embarcadero RAD Studio XE3 и выше импорт выполняется командой Component — Import —Component —VCL for C++ Win32.
Перед запуском команды требуется снять в настройках Tools — Options — Delphi Options — Type Library — RTL следующие флаги:
Check for UTF8 data in type library
Store Unicode data as UTF8 in type library
Аналогичные настройки снять в Tools — Options — С++ Options — Type Library — RTL.
Данные настройки влияют на корректность импорта helpstring-ов из tlb.
4.2. Выберите файл kAPI5.tlb или kAPI7.tlb для использования API7, а также файлы констант ksConstants.tlb и ksConstants3D.tlb.
Так как файл kAPI7.tlb использует все перечисленные tlb, достаточно импорт сделать с данного файла — при этом будут созданы файлы для всех tlb.
4.3. Выключите опцию Generate Component Wrapper.
5.Укажите путь к папке SDK\Include в параметре Unit dir name.
6.Нажмите кнопку Create Unit.
7.Переименуйте полученные файлы в ks_tlb.h, ks_tlb.cpp (ksAPI7.cpp и ksAPI7.h при импорте kAPI7.tlb).
При сохранении под другим именем в ks_tlb.cpp изменяется имя namespace Kompas6api5_tlb на ks_tlb. Требуется вернуть Kompas6api5.
8.Отредактируйте в файле ks_tlb.cpp подключение h файла, если оно не изменилось при сохранении.
В ksAPI7.h требуется отредактировать подключение фалов, полученных с kAPI5.tlb.


## Delphi

Замените файлы LibTool.pas, LIBdb.pas, LDefin.pas, LDefin2D.pas, LDefin3D.pas на новые.
Возможность компиляции 64-разрядных библиотек есть в Embarcadero RAD Studio XE2 и выше.
При компиляции под x64 не работает директива __pascal.
Требуется изменение функций. Критично для функций, имеющих более одного параметра.
Требуется разворот параметров функций.
Старый вариант:
function CallBackP( _dynamic : Integer;                      // Признак динамического процесса
phantom  : Pointer;                      // Фантом
info     : PRequestInfo;                 // Параметры запроса
var angl, y, x : Double;                 // Параметры запроса
com      : integer ) : Integer; pascal ; // Номер команды
Новый вариант:
function CallBackP( com      : integer;
var x, y, angl : Double;                 // Координаты курсора
info     : PRequestInfo;                 // Параметры запроса
phantom  : Pointer;                      // Фантом
_dynamic : Integer                      // Признак динамического процесса
) : Integer; stdcall; // Номер команды
Классы string и TString стали Unicod-ными, указатель PChar также стал Unicod-ным.
Требуется замена на использование AnsiString и PАnsiChar.
Рекомендуется выполнить перевод библиотеки на использование Unicod-ных аналогов структур и функций. При выполнении перевода рекомендуется использование Unicod-ных классов строк WideString и указателя на строку PWideChar.


## Delphi Automation

Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующие действия.
1.Вызовите команду Project — Import type library — Add.
В Embarcadero RAD Studio XE2 и выше импорт выполняется командой Component — Import — Component — VCL for Delphi Win32.
2.Выберите файл kAPI5.tlb.
3.Выключите опцию Generate Component Wrapper.
4.Укажите путь к корневой папке размещения примеров Unit dir name.
5.Нажмите кнопку Create Unit.
6.Переименуйте полученный файл в KsTLB.pas и отредактируйте его первую строку.
7.Найдите строчку Application = KompasObject; и исправьте на ksApp = KompasObject;
Это нужно, чтобы избежать конфликта с глобальной переменной Delphi Forms.Application.


## Компиляция библиотек

Builder C++
Builder C++ Automation
Delphi
Delphi Automation
Visual Basic
Visual C++
Python
Рекомендации по доработкам библиотек, написанных на VC++, не имеющих WinApp и использующих MFC
Использование библиотек типов интерфейсов Системы КОМПАС-3D


## Python

Для получения возможности использования API Компас в Python требуется выполнить импорт с tlb-файлов ksConstants.tlb, ksConstants3D.tlb, kAPI5.tlb, kAPI7.tlb:
from win32com.client import gencache
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)


## Visual Basic

Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующие действия.
1.Вызовите команду Project — References… — Browse…
2.Выберите файл kAPI5.tlb.


## Visual C++

1.Удалите файлы libautoold.cpp и libautoold.h с диска и из проекта.
2.Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующие действия.
2.1. Вызовите команду View — ClassWizard — Add Class — From a type Library.
2.2. Выберите файл V.
2.3. Выделите все интерфейсы в списке.
Данный вариант работает корректно только в Visual C++ 6.0. В Visual C++ 2003 и выше. Для каждого интерфейса требуется перезадавать имя файла, в который он будет импортирован, что очень неудобно.
Без перезадания для каждого интерфейса будет создан отдельный файл.
Вместо генерации файлов через ClassWizard рекомендуется использовать директиву #import
#import “kAPI5.tlb”
При этом создается описание классов, являющихся оболочками над интерфейсами — так называемые умные указатели или smart Pointer.
К названиям интерфейсов добавляется суффикс Ptr, что позволяет скрыть явное использование функций AddRef Release и QueryInterface, а также дает возможность использования свойств property.
