Имя: Пароль:
1C
1С v8
Создание внешней компоненты с использованием сторонних библиотек
0 Elizir
 
14.12.14
20:12
Доброго вечера!
Столкнулся со следующей проблемой. Необходимо организовать загрузку данных ТСД Opticon OPN-2001. Подключается по USB, эмулирует COM-порт. Драйвера у него свои, какие команды ему можно по COM отправить для получения - неизвестно. Но производитель прикладывает для работы SDK - http://old.opticon.com/uploads/Software/SDK_EGFS012x.zip
Собственно, используя lib оттуда, написал простенькое консольное приложение, выводящее список штрихкодов с устройства - все работает замечательно. Обрадовавшись, написал аналогичную ВК с одним методом, принимающим номер порта и возвращающим строку с штрихкодами. Но увы, при попытке регистрации ВК 1С аварийно завершает работу. Начал выборочно комментить строки кода в ВК, пришел к выводу, что дело именно в функциях из SDK - если их нет (причем неважно, вызываются они или нет, факт в их наличии в коде), то компонента регистрируется нормально, если есть - вылетает.
Вот и думаю, может, есть какие-нибудь тонкости при использовании библиотек при написании своей dll и для написания ВК для 1С в частности. Никто не сталкивался?
P.S. Разработка велась в 2013 студии.
1 Рэйв
 
14.12.14
20:18
(0)Ты не по адресу, дружище. Это тебе скорее к разработчикам платформы.
А так как тут многие хотят пощупать им лицо:-).., то ответа ты вряд ли добьешься.
2 Garykom
 
гуру
14.12.14
20:20
(0) а "lib оттуда" в свою dll(ВК) то засунул?
3 Elizir
 
14.12.14
20:43
(1) Ну, хотелось бы надеяться, что я все-таки накосячил где-то) Хотя вот сейчас еще заметил, что если после регистрации компоненты еще кода накидать (в том числе и обращения к объекту этой самой ВК, например, вызвать оттуда другую функцию попроще), то платформа их успевает обрабатывать, а потом уже наворачивается, это совсем уж странно...
(2) Файл *.lib прилинкован к проекту, но там только описание экспортных функций прилагаемой также dll, вот её в проект не пихал, она лежит в каталоге 1С. Без нее 1С при регистрации ВК ругается на отсутствие dll, что логично, а с ней - описанное выше. Так что дело все-таки не в этом.
4 Garykom
 
гуру
14.12.14
20:45
(3) а "от имени админа" пробовал? может просто в этом фигня какая то, типа dll-ке больше прав нужно?
5 DmitrO
 
14.12.14
21:07
Не причем тут 1с - накосячил где то. Судя по всему не правильно работаешь с объектами из функциональной длл.
6 H A D G E H O G s
 
14.12.14
22:22
7 DmitrO
 
14.12.14
23:00
(6)если у него есть либ, то у него есть и заголовочный файл, и это исключает использование не верного способа вызова.
8 Rebelx
 
14.12.14
23:17
(0)врядли сторонняя библиотека тут виновата
скорее ты косячишь
ну сделай компонету Native
9 H A D G E H O G s
 
14.12.14
23:20
(7) Моя не понимайт C++. Либ - это аналог pas с описанием статического импорта функций из dll?
10 DmitrO
 
14.12.14
23:57
Написано что валится при регистрации. Регистрации COM сервера чтоли? Это в принципе странно. Что то тут не чисто. Непосредственно при регистрации не должно быть обращений к функциональной длл, код регистрации стандартный, там накосячить надо постараться. В то же время сообщается, что при исключении использования функционально длл, регистрация успешна. Это позволяет сделать вывод что проблема возникает просто при загрузке функциональной длл. Такое вполне возможно, при инициализации глобальных данных (статических экземпляров) внутри функциональной длл, но это мало вероятно.
11 DmitrO
 
15.12.14
00:11
(9) почти, только либ это уже бинарник, а pas это исходник.
По идее либ это нечто между объектным файлом (которые из под компилятора сразу) и готовым бинарником (dll). Это набор скомпилированных функций которые линкер может включать в собираемые бинарники (dll,exe) - статическая библиотека.
Но в данном случае это просто набор переходников предназначенный для использования динамической библиотеки как статической.
12 Elizir
 
15.12.14
08:16
Ну, сейчас сделал самый простейший вариант. Беру с ИТС их пример ВК.В Linker проекта указываю путь к CSp2.lib, в заголовочном AddinNative.h включаю заголовок CSp2.h. И, наконец, в уже готовой тестовой процедуре ВК eMethEnable (она же "Включить") добавляю одну строчку с вызовом функции из SDK - инициализацию/открытие порта.
Теперь внимание, комментирую эту строчку - полет нормальный. Оставляю - запись дампа, вылет в момент создания нового объекта. Да, кстати, тип компоненты Native.
Ну где здесь можно ошибиться?) Тем более что процедуру я эту не вызываю.
13 Smile 8D
 
15.12.14
08:59
У приложения для 1С:Деньги на Андроид (неофициального) была похожая проблема, которая решалась некоторым шаманством. Если в обработке закомментировать подключение компоненты, запустить выполнение этого кода в 1С, затем подменить обработку на такую же с разкомментированной строчкой и открыть ее через список недавно открытых, то все работает. С чем связан этот глюк не понятно, видимо где-то что-то кэширует. Проблема была на 8.3.5 (точный релиз не помню).
14 DmitrO
 
15.12.14
10:03
(12) тогда итог: что происходит - не понятно. Когда не понятно что мы делаем? ..правильно, берем отладчик и дебажим.. он ведь покажет откуда произошел вылет в космос, и доходит ли дело вообще до создания объекта компоненты или уже на этапе загрузки длл происходит отказ.
15 Кирпич
 
15.12.14
10:07
Там же вроде ActiveX есть. Можно и без ВК обойтись.
16 DrZombi
 
гуру
15.12.14
10:17
(0) Дай посмотреть, твой код :)
17 DrZombi
 
гуру
15.12.14
10:19
(12) Код покажи, что ты нам на пальцах тут пишешь, что Мопед не твой. и руки прямые. Народ уже в сомнениях твоих правильных поступках :)
18 Elizir
 
15.12.14
11:19
(16) Без проблем) Вот проект, описанный в (12) : https://yadi.sk/d/r6HfoO8bdNx8a
DLL для работы лежит в include.

Ну и запускаю во внешней обработке при создании:
ПодключитьВнешнююКомпоненту("D:\testvk\bind\AddInNative.dll", "Comp", ТипВнешнейКомпоненты.Native);
ВК = Новый("AddIn.Comp.AddInNativeExtension");
//ВК.Включить();
19 H A D G E H O G s
 
15.12.14
11:37
(18) Ссылка неоперабельна.