Проблема с созданием и подключением NativeAPI внешней компоненты для 1С

1. Dipod 114 25.01.21 11:28 Сейчас в теме
Пытаюсь написать обёртку NativeAPI для 1С, которая использует другую библиотеку, написанную на C++.

Уже проверил принципиальную возможность этого.
Самостоятельно написал библиотеку с одной функцией, которая суммирует два числа и возвращает результат.
Затем написал NativeAPI библиотеку для 1С, которая использует библиотеку, что я написал выше.
В 1С внешняя компонента подключается, и складывает два числа которые я передаю с формы 1С.

Пытаюсь проделать то же самое с реальной библиотекой.
Там был пример использования. В качестве приложения exe пример отрабатывает замечательно.
Пытаюсь перенести в NativeAPI, но 1C отказывается подключать эту внешнюю компоненту. Метод ПодключитьВнешнююКомпоненту возвращает Ложь и непонятно почему.

Платформа x64, свою библиотеку компилирую как x64, каталог с внешней библиотекой в path добавил, чтобы не было с этим проблем.

Нужны идеи как решить проблему, куда ещё посмотреть можно и т.п. Короче мозговой штурм.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. platonov.e 159 25.01.21 11:50 Сейчас в теме
Ну как вариант, может нужно еще УстановитьВнешнююКомпоненту?
Просто ни кода, ничего нет, сложно ориентироватсья.
4. Dipod 114 25.01.21 11:52 Сейчас в теме
(2)В тестовом примере работало и без установки внешней компоненты
3. Dipod 114 25.01.21 11:51 Сейчас в теме
По совету коллег посмотрел журнал ошибкок Windows

Имя сбойного приложения: 1cv8c.exe, версия: 8.3.18.1208, метка времени: 0x5fb42854
Имя сбойного модуля: Aspose.PDF.Cpp_vc14x64.dll, версия: 0.0.0.0, метка времени: 0x5fb1cdc8
Код исключения: 0xc00000fd
Смещение ошибки: 0x0000000003fb8f08
Идентификатор сбойного процесса: 0x40c4
Время запуска сбойного приложения: 0x01d6f2f650219bcd
Путь сбойного приложения: C:\Program Files\1cv8\8.3.18.1208\bin\1cv8c.exe
Путь сбойного модуля: C:\Users\dipod\Desktop\ExternalLibs\Aspose.PDF.Cpp_vc14x64.dll
Идентификатор отчета: fdf694b8-5933-444e-aca4-058a0c31bfa0
Полное имя сбойного пакета:
Код приложения, связанного со сбойным пакетом:
Подробности:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>100</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2021-01-25T08:44:52.5265681Z" />
<EventRecordID>15755</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>Application</Channel>
<Computer>DESKTOP-GNISGNR</Computer>
<Security />
</System>
- <EventData>
<Data>1cv8c.exe</Data>
<Data>8.3.18.1208</Data>
<Data>5fb42854</Data>
<Data>Aspose.PDF.Cpp_vc14x64.dll</Data>
<Data>0.0.0.0</Data>
<Data>5fb1cdc8</Data>
<Data>c00000fd</Data>
<Data>0000000003fb8f08</Data>
<Data>40c4</Data>
<Data>01d6f2f650219bcd</Data>
<Data>C:\Program Files\1cv8\8.3.18.1208\bin\1cv8c.exe</Data>
<Data>C:\Users\dipod\Desktop\ExternalLibs\Aspose.PDF.Cpp_vc14x64.dll</Data>
<Data>fdf694b8-5933-444e-aca4-058a0c31bfa0</Data>
<Data />
<Data />
</EventData>
</Event>

Aspose.PDF.Cpp_vc14x64.dll - это как раз та библиотека, которую я пытаюсь использовать.

Насколько я понял из этого отчёта по ошибке, моя компонента нормально подключается, пытается затянуть за собой Aspose.PDF.Cpp_vc14x64.dll, и что-то идёт не так.
5. andy_zhav 197 25.01.21 11:56 Сейчас в теме
Клиент 1с точно в режиме х64 запущен? Возможно запущен клиент х86
6. Dipod 114 25.01.21 11:59 Сейчас в теме
(5)Да, клиент тоже запускаю в режиме x64
7. andy_zhav 197 25.01.21 12:04 Сейчас в теме
(6) А какой режим стоит? 64 (x86_64) или Приоритет 64 (x86_64)?
8. Dipod 114 25.01.21 12:05 Сейчас в теме
(7)64 (x86_64) 32-битная платформа у меня вообще не установлена
9. ilnur75 25.01.21 12:08 Сейчас в теме
используйте Visual Studio. в ней создайте проект с вашей библиотекой с нужной разрядностью виндовс.
может ваша библиотека написана для 32 -битной платформы.
10. nikitan 95 25.01.21 12:14 Сейчас в теме
используйте Visual Studio. в ней создайте проект с вашей библиотекой с нужной разрядностью виндовс.
может ваша библиотека написана для 32 -битной платформы.


Согласен с предыдущим оратором.
Прикрепленные файлы:
12. Dipod 114 25.01.21 12:17 Сейчас в теме
(10)Я скачал комплект поставки билиотеки с официального сайта и там есть варианты как 32 бит, так и 64. При сборке использую именно 64 битную версию, как верно заметил (11)
11. andy_zhav 197 25.01.21 12:15 Сейчас в теме
(10) Судя по названию dll - все таки под х64: Aspose.PDF.Cpp_vc14x64
13. nikitan 95 25.01.21 12:18 Сейчас в теме
(11) Ну путь хоть топикстартер свойства этого файлика покажет что ли... Не верю я в чудеса.
15. Dipod 114 25.01.21 12:19 Сейчас в теме
Что вы подразумеваете под свойствами файлика?
17. nikitan 95 25.01.21 12:28 Сейчас в теме
(15) Немного не правильно выразился. Если установлен 7zip, например, то можно вот так разрядность посмотреть:
Прикрепленные файлы:
19. Dipod 114 25.01.21 12:34 Сейчас в теме
(17)Держи
Прикрепленные файлы:
14. andy_zhav 197 25.01.21 12:18 Сейчас в теме
(12) Думаю нужно отладчиком VS подключиться к процессу 1с, ставить бряку в dll в main и смотреть уже там. А вообще лучше с 1с использовать 32 битные компоненты. Сыра 1с еще для 64 бита в этом плане.
16. Dipod 114 25.01.21 12:22 Сейчас в теме
(14)К сожалению, было требование делать именно x64

у dll нет функции main. есть файл dllmain.cpp, который, похоже, является точкой входа и экспортируемые процедуры.

Запустить отладку я попробую, но там те ещё танцы с бубном. Смогу заняться только вечером
18. andy_zhav 197 25.01.21 12:32 Сейчас в теме
20. Dipod 114 25.01.21 12:38 Сейчас в теме
Сейчас готовлю архив проекта на поиграться.
21. nikitan 95 25.01.21 12:40 Сейчас в теме
(19) Может быть вопрос мой покажется несколько наивным, но 1С же запускается от имени администратора? Ну чтобы исключить проблему того что не хватает прав для подключения библиотеки.
22. Dipod 114 25.01.21 12:41 Сейчас в теме
(21) Проверил, проблему не решило. Ну и тестовый пример с библиотекой сумматором работал без прав админа
23. Dipod 114 25.01.21 12:55 Сейчас в теме
Ссылка на архив проекта

Папка AsposePDFAdapter - мой проект, который не работает
Папка example - проект из поставки библиотеки.

В моем проекте могут быть захардкожены абсолютные пути к инклудам, нужно будет поправить на ваш, чтобы скомпилировалось.

Папка erf содержит исходники внешней обработки с помощью которой тестирую

Проекты собираю в конфигурации Release/x64
24. Dipod 114 25.01.21 13:04 Сейчас в теме
Чтобы скомпилированная внешняя компонента заработала, каталог к её зависимостям должен быть прописан в path. Это один из подводных камней, который я нашёл при разработке тестового сумматора.
25. Dipod 114 25.01.21 13:08 Сейчас в теме
Получается, что моя внешняя компонента зависит от Aspose.Pdf.Cpp_vc14x64.dll, которая в свою очеред зависит от aspose_cpp_vc14x64.dll. Все они должны быть в каталоге, путь к которому указан в PATH
26. sivin-alexey 511 26.02.21 05:29 Сейчас в теме
В компоненте нужно убрать зависимость от Aspose.Pdf.Cpp_vc14x64.dll и использовать позднее связываение - LoadLibrary(). Далее с помощью GetProcAddress() получить адреса нужных функций и вызывать их.
27. Dipod 114 26.02.21 14:40 Сейчас в теме
(26) Не совсем понятно. Нужно вообще убрать зависимость от Aspose.Pdf.Cpp_vc14x64.dll или просто использовать позднее связывание? Расскажите как вы видите это поподробнее, пожалуйста.
28. sivin-alexey 511 26.02.21 15:17 Сейчас в теме +5 $m
(27)
1. Нужно убрать зависимость от Aspose.Pdf.Cpp_vc14x64.dll (ранее связывание).
2. Вместо ранего связывания нужно использовать позднее связываение:
2.1. В методе Init() загрузить библиотеку - LoadLibrary("Aspose.Pdf.Cpp_vc14x64.dll") и получить адреса функций из неё GetProcAddress()
2.2. В методах компоненты вызывать функции Aspose.Pdf.Cpp_vc14x64.dll через полученные адреса.
2.3. В методе Done() выгрузить библиотеку - FreeLibrary().

LoadLibrary(), GetProcAddress(), FreeLibrary() - это методы WinAPI
29. Dipod 114 15.03.21 09:41 Сейчас в теме +25 $m
(28) Идея, похоже дельная, и она может сработать, но времени проверять её у меня уже нет. От задачи отказались. Я отсыплю немного стартмани за хорошую идею.
30. Xershi 1506 05.12.23 15:41 Сейчас в теме
1С сохраняет компоненту во временной папке пользователя, например "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

и пытается зарегистрировать ее в ветке реестра HKEY_CLASSES_ROOT именно по этому пути.

На терминале у обычных пользователей нет прав на изменение этой ветки реестра, поэтому компонента у них не подключается.

Теперь о том, как выйти из этой ситуации.

Метод глобального контекста ПодключитьВнешнююКомпоненту() имеет несколько вариантов синтаксиса. Вот этим мы и воспользуемся.

Итак, по шагам:

1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:\WINDOWS\SYSTEM32 для 32-разрядной ОС или в папке C:\WINDOWS\SYSWOW64 для 64-разрядной ОС.

2. Используем один из двух дополнительных вариантов синтаксиса метода ПодключитьВнешнююКомпоненту():

Вариант 1:

ПодключитьВнешнююКомпоненту("C:\WINDOWS\SysWOW64\Scaner1C.dll", "АТОЛСканер", ТипВнешнейКомпоненты.COM);

ОбъектДрайвера = Новый ("AddIn.АТОЛСканер.Scaner45");


Вариант 2:

ProgID = "AddIn.Scaner45";

ПодключитьВнешнююКомпоненту(ProgID);

ОбъектДрайвера = Новый (ProgID);

Взято от сюда.
31. Dipod 114 05.12.23 15:42 Сейчас в теме
(30)
(30)
Спасибо. Когда-нибудь я это попробую, когда опять понадобится это сделать.
Оставьте свое сообщение

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