Пытаюсь написать обёртку NativeAPI для 1С, которая использует другую библиотеку, написанную на C++.
Уже проверил принципиальную возможность этого.
Самостоятельно написал библиотеку с одной функцией, которая суммирует два числа и возвращает результат.
Затем написал NativeAPI библиотеку для 1С, которая использует библиотеку, что я написал выше.
В 1С внешняя компонента подключается, и складывает два числа которые я передаю с формы 1С.
Пытаюсь проделать то же самое с реальной библиотекой.
Там был пример использования. В качестве приложения exe пример отрабатывает замечательно.
Пытаюсь перенести в NativeAPI, но 1C отказывается подключать эту внешнюю компоненту. Метод ПодключитьВнешнююКомпоненту возвращает Ложь и непонятно почему.
Платформа x64, свою библиотеку компилирую как x64, каталог с внешней библиотекой в path добавил, чтобы не было с этим проблем.
Нужны идеи как решить проблему, куда ещё посмотреть можно и т.п. Короче мозговой штурм.
Aspose.PDF.Cpp_vc14x64.dll - это как раз та библиотека, которую я пытаюсь использовать.
Насколько я понял из этого отчёта по ошибке, моя компонента нормально подключается, пытается затянуть за собой Aspose.PDF.Cpp_vc14x64.dll, и что-то идёт не так.
используйте Visual Studio. в ней создайте проект с вашей библиотекой с нужной разрядностью виндовс.
может ваша библиотека написана для 32 -битной платформы.
используйте Visual Studio. в ней создайте проект с вашей библиотекой с нужной разрядностью виндовс.
может ваша библиотека написана для 32 -битной платформы.
(10)Я скачал комплект поставки билиотеки с официального сайта и там есть варианты как 32 бит, так и 64. При сборке использую именно 64 битную версию, как верно заметил (11)
(12) Думаю нужно отладчиком VS подключиться к процессу 1с, ставить бряку в dll в main и смотреть уже там. А вообще лучше с 1с использовать 32 битные компоненты. Сыра 1с еще для 64 бита в этом плане.
(19) Может быть вопрос мой покажется несколько наивным, но 1С же запускается от имени администратора? Ну чтобы исключить проблему того что не хватает прав для подключения библиотеки.
Чтобы скомпилированная внешняя компонента заработала, каталог к её зависимостям должен быть прописан в path. Это один из подводных камней, который я нашёл при разработке тестового сумматора.
Получается, что моя внешняя компонента зависит от Aspose.Pdf.Cpp_vc14x64.dll, которая в свою очеред зависит от aspose_cpp_vc14x64.dll. Все они должны быть в каталоге, путь к которому указан в PATH
В компоненте нужно убрать зависимость от Aspose.Pdf.Cpp_vc14x64.dll и использовать позднее связываение - LoadLibrary(). Далее с помощью GetProcAddress() получить адреса нужных функций и вызывать их.
(26) Не совсем понятно. Нужно вообще убрать зависимость от Aspose.Pdf.Cpp_vc14x64.dll или просто использовать позднее связывание? Расскажите как вы видите это поподробнее, пожалуйста.
28.
sivin-alexey
51126.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
(28) Идея, похоже дельная, и она может сработать, но времени проверять её у меня уже нет. От задачи отказались. Я отсыплю немного стартмани за хорошую идею.
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);