Создание внешней компоненты с помощью MinGW

1. PerlAmutor 129 10.08.17 16:20 Сейчас в теме
Добрый день. Бьюсь уже неделю, не могу заставить работать тестовую внешнюю компоненту с ИТС.- "AddInNative"
По идеологическим соображениям отказался от использования MSVC и решил собрать компоненту с помощью MinGW (gcc).

Первое с чем я столкнулся это отсутствие возможности сгенерить Makefile из CMakeLists.txt. Т.к. разработчики предусмотрели сборку только либо с помощью msvc, либо с помощью gcc (linux only). Когда я вручную доработал cmakelists.txt файл , то в последствии пришлось еще править и исходники компоненты, т.к. началась "свистопляска" с дефайнами в хедерах. Это я тоже победил. Компонента собралась но потащила с собой эти файлы:
libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll

В итоге пришло осознание того, что 1С умеет работать только со standalone файлами плагинов и не видит эти .dll даже если они лежат в той же папке откуда грузится компонента. Т.е. нужно было все это компилировать статически в один файл. К сожалению "заставить" стандартную сборку MinGW залинковать статически библиотеки не удалось. Скачал в итоге сборку TDM-GCC, снова пришлось под неё править исходники компоненты, т.к. эта сборка не знает ничего о некоторых чисто msvcr функциях. Все-таки dll собралась статически. Но при вызове ПодключитьВнешнююКомпоненту() грохает клиент с исключением.

В связи с чем прошу поделиться вас своим опытом по сборке и линковке внешних компонентов, которые имеют зависимости от других .dll и собираются не только с помощью msvc, у которого синтаксис С++ может радикально отличаться от gcc.
Bolatt83; +1 Ответить
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Bolatt83 25.04.23 17:23 Сейчас в теме
(1)
Приветствую Вас, коллеги! Уже месяц потратил на этот пример Native API, и тоже не нашел решения. Я добавил во все методы компоненты отладочный код, который выводит записи в лог-файл и вот что я получил:

2023-04-25 19:43:17 DLLMain()
2023-04-25 19:43:17 GetClassNames() - begin
2023-04-25 19:43:17 GetClassNames() - end: will retun CAddInNative
2023-04-25 19:43:17 DLLMain()
2023-04-25 19:43:17 DLLMain()
2023-04-25 19:43:17 GetClassObject("CAddInNative", &(0000000000000000)) - begin
2023-04-25 19:43:17 GetClassObject(): entered statement if(!*pInterface) {}
2023-04-25 19:43:17 CAddInNative::CAddInNative() - begin
2023-04-25 19:43:17 CAddInNative::CAddInNative() - end
2023-04-25 19:43:17 GetClassObject() - end: will return 00000000517c4070
2023-04-25 19:43:17 SetPlatformCapabilities(1) - begin
2023-04-25 19:43:17 SetPlatformCapabilities() - end: will return 3
2023-04-25 19:43:17 CAddInNative::~CAddInNative()


И все, на этом 1С падает. Остальные методы она не вызывает, или не может вызвать.
Потом, на всякий случай, доработал SetPlatformCapabilities() чтобы он возвращал 1, бесполезно, то же самое.
Остается подозрение, что MinGW в неправильном порядке строит таблицу методов интерфейсов. Обратите внимание, ни один метод ни одного интерфейса не был вызван.
Я использовал 64- и 32-разрядные MinGW:
winlibs-x86_64-posix-seh-gcc-12.2.0-llvm-15.0.7-mingw-w64ucrt-10.0.0-r4
winlibs-i686-posix-dwarf-gcc-12.2.0-mingw-w64ucrt-10.0.0-r4
Еще бы дизассемблером уметь пользоваться. А вообще лучше будет получить ответ от разработчиков 1С, есть ли такой форум?

Если кому-то интересно, опубликую коды.
2. PerlAmutor 129 11.08.17 12:27 Сейчас в теме
Запустил под gdb. Вот что пишет:

warning: shell\ext\thumbnailcache\lib\thumbcacheapi.cpp(226)\thumbcache.dll!6AE4069D: (caller: 6AE406F1) ReturnHr[PreRelease](1) tid(500) 8004B200
[Thread 7696.0x1eec exited with code 0]

Thread 1 received signal SIGSEGV, Segmentation fault.
[Switching to Thread 7696.0x1740]
0x62601337 in CAddInNative::~CAddInNative (this=0x6261e5e0 <vtable for CAddInNative+8>, __in_chrg=<optimized out>)
    at I:\mingwprojects\VNCOMP83\example\NativeAPI\AddInNative.cpp:90
90      CAddInNative::~CAddInNative()
Показать

Что за dll'ка thumbcache.dll такая?
3. PerlAmutor 129 11.08.17 12:51 Сейчас в теме
Похоже дело все-таки в несовместимости механизмов msvc и gcc управлением памяти. Судя по этим статьям:
http://www.mingw.org/wiki/Interoperability_of_Libraries_Created_by_Different_­Compiler_Brands
https://chadaustin.me/cppinterface.html

Подружить 1С с MinGW будет сложно или невозможно. Я думал может хоть есть какой пример внешней компоненты на чистом Си. Но нет, зачем-то 1С потребовалось использовать классы.
4. user1430946 02.07.20 15:02 Сейчас в теме
сделал компоненту mingw, 1С подцепляет, и вызывает деструктор класса вместо init.
не нашел как побороть.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот