e1337e4016
docs/Kompas3D_SDK/ становится каноническим источником справки КОМПАС SDK и включается в репозиторий (2491 файл, ~14 МБ). HTML-зеркало docs/KOMPAS_SDK_ru-RU/ (~1.4 ГБ, © АСКОН) и генератор tools/build_kompas3d_sdk.py больше не нужны — регенерация не предполагается. - .gitignore: MD-база разблокирована; зеркало остаётся проигнорированным (safety-net на случай повторной локальной выгрузки). - CLAUDE.md / SKILL.md: убраны упоминания регенерации и зеркала. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
160 lines
12 KiB
Markdown
160 lines
12 KiB
Markdown
---
|
||
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.
|