Files
kompas3d-mcp/docs/Kompas3D_SDK/guides/compiling.md
T
mikhail e1337e4016 feat(sdk-docs): MD-база знаний SDK — в репозиторий; генератор и зеркало убраны
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>
2026-05-26 20:00:05 +03:00

160 lines
12 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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.