Проблема с созданием и подключением NativeAPI внешней компоненты для 1С
Пытаюсь написать обёртку NativeAPI для 1С, которая использует другую библиотеку, написанную на C++.
Уже проверил принципиальную возможность этого.
Самостоятельно написал библиотеку с одной функцией, которая суммирует два числа и возвращает результат.
Затем написал NativeAPI библиотеку для 1С, которая использует библиотеку, что я написал выше.
В 1С внешняя компонента подключается, и складывает два числа которые я передаю с формы 1С.
Пытаюсь проделать то же самое с реальной библиотекой.
Там был пример использования. В качестве приложения exe пример отрабатывает замечательно.
Пытаюсь перенести в NativeAPI, но 1C отказывается подключать эту внешнюю компоненту. Метод ПодключитьВнешнююКомпоненту возвращает Ложь и непонятно почему.
Платформа x64, свою библиотеку компилирую как x64, каталог с внешней библиотекой в path добавил, чтобы не было с этим проблем.
Нужны идеи как решить проблему, куда ещё посмотреть можно и т.п. Короче мозговой штурм.
Уже проверил принципиальную возможность этого.
Самостоятельно написал библиотеку с одной функцией, которая суммирует два числа и возвращает результат.
Затем написал NativeAPI библиотеку для 1С, которая использует библиотеку, что я написал выше.
В 1С внешняя компонента подключается, и складывает два числа которые я передаю с формы 1С.
Пытаюсь проделать то же самое с реальной библиотекой.
Там был пример использования. В качестве приложения exe пример отрабатывает замечательно.
Пытаюсь перенести в NativeAPI, но 1C отказывается подключать эту внешнюю компоненту. Метод ПодключитьВнешнююКомпоненту возвращает Ложь и непонятно почему.
Платформа x64, свою библиотеку компилирую как x64, каталог с внешней библиотекой в path добавил, чтобы не было с этим проблем.
Нужны идеи как решить проблему, куда ещё посмотреть можно и т.п. Короче мозговой штурм.
По теме из базы знаний
- Создание внешних компонент 1С по технологии NativeAPI на языке Eiffel
- Разработка внешней компоненты по технологии Native API. Мониторинг файловой системы в 1С
- Решение для работы внешней компоненты в веб-браузере под Windows: CMake+NSIS
- Драйвер электронных весов Физтех Т11. Внешняя компонента Native API 1С (x86-64)
- PDFConverter — кроссплатформенная NativeAPI компонента для 1С (PDF Image)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Ну как вариант, может нужно еще УстановитьВнешнююКомпоненту?
Просто ни кода, ничего нет, сложно ориентироватсья.
Просто ни кода, ничего нет, сложно ориентироватсья.
По совету коллег посмотрел журнал ошибкок 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, и что-то идёт не так.
Имя сбойного приложения: 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, и что-то идёт не так.
используйте Visual Studio. в ней создайте проект с вашей библиотекой с нужной разрядностью виндовс.
может ваша библиотека написана для 32 -битной платформы.
может ваша библиотека написана для 32 -битной платформы.
используйте Visual Studio. в ней создайте проект с вашей библиотекой с нужной разрядностью виндовс.
может ваша библиотека написана для 32 -битной платформы.
может ваша библиотека написана для 32 -битной платформы.
Согласен с предыдущим оратором.
Прикрепленные файлы:
(14)К сожалению, было требование делать именно x64
у dll нет функции main. есть файл dllmain.cpp, который, похоже, является точкой входа и экспортируемые процедуры.
Запустить отладку я попробую, но там те ещё танцы с бубном. Смогу заняться только вечером
у dll нет функции main. есть файл dllmain.cpp, который, похоже, является точкой входа и экспортируемые процедуры.
Запустить отладку я попробую, но там те ещё танцы с бубном. Смогу заняться только вечером
Папка AsposePDFAdapter - мой проект, который не работает
Папка example - проект из поставки библиотеки.
В моем проекте могут быть захардкожены абсолютные пути к инклудам, нужно будет поправить на ваш, чтобы скомпилировалось.
Папка erf содержит исходники внешней обработки с помощью которой тестирую
Проекты собираю в конфигурации Release/x64
Чтобы скомпилированная внешняя компонента заработала, каталог к её зависимостям должен быть прописан в path. Это один из подводных камней, который я нашёл при разработке тестового сумматора.
Получается, что моя внешняя компонента зависит от Aspose.Pdf.Cpp_vc14x64.dll, которая в свою очеред зависит от aspose_cpp_vc14x64.dll. Все они должны быть в каталоге, путь к которому указан в PATH
В компоненте нужно убрать зависимость от Aspose.Pdf.Cpp_vc14x64.dll и использовать позднее связываение - LoadLibrary(). Далее с помощью GetProcAddress() получить адреса нужных функций и вызывать их.
(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
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
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:
Вариант 2:
Взято от .
и пытается зарегистрировать ее в ветке реестра 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);Взято от .
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот