Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Внешняя компонента использует стороннюю DLL

Внешняя компонента использует стороннюю DLL
Я
   Santiago
 
18.10.19 - 11:26
Доброго времени суток!

Перерыл все источники. У меня ошибка с загрузкой и использованием внешней компоненты с 1С следующая:

1. Создал ВК при помощи Visual Studio 2017
2. Полученную библиотеку 1С_DLL.dll подключаю следующим образом:

   ПодключитьВнешнююКомпоненту("d:\1С_DLL.dll", "DemoVK", ТипВнешнейКомпоненты.Native);
  
   ДемоКомп = Новый("AddIn.DemoVK.SameName");
        
   пер = ДемоКомп.CallBack("YES!","NO!!");
   Сообщить(пер)

   делаю все на клиенте, платформа 8.3.9.1850 х64

3. Моя компонента использует стороннюю DLL

4. Все работает, но только 1 раз, последующий вызов функции (1С платформа не выключается) выдает ошибку "Не найден файл внешней компоненты"

5. Как только в своей DLL отключаю вызов функций из сторонней DLL, все работает хорошо и без ошибок

Помогите разобраться
 
 
   Garykom
 
1 - 18.10.19 - 12:13
(0) Работа с памятью неправильная скорее всего.

Забей на ВК и делай на веб-сервисах, это сильно проще.
По сути поднимаешь некий сервер (можно и локально на том же компе) и по http с ним.
   Santiago
 
2 - 18.10.19 - 12:42
(1)  Мне край нужно использовать инструментарий API, который скрыт в сторонней DLL, вот и пытаюсь это делать через ВК (как промежуточное звено)

В целом мне нужно выполнять код на С++ с использованием сторонней DLL

Может быть я гружу неправильно ВК? Читал есть варианты использовать через "Общие макеты", но попытки не увечались успехом)
   Кирпич
 
3 - 18.10.19 - 12:56
ну и положи свою стороннюю dll куда нибудь в общедоступное место
   Santiago
 
4 - 18.10.19 - 13:03
(3)  Везде разложил ее, по всем местам.

Первый раз то платформа ее грузит, все выполнятся отлично.

Второй раз ошибка.

Если 1С перегрузить, то выполнятся все снова хорошо, но 1 раз.
   Garykom
 
5 - 18.10.19 - 13:08
ПодключитьВнешнююКомпоненту("d:\1С_DLL.dll", "DemoVK", ТипВнешнейКомпоненты.Native);
  
ДемоКомп = Новый("AddIn.DemoVK.SameName");
        
пер = ДемоКомп.CallBack("YES!","NO!!");
Сообщить(пер)

втор = ДемоКомп.CallBack("YES!","NO!!");
Сообщить(втор)


Хочешь сказать что вот такой неразрывный код глючит?
Что делает твоя ВК внутри по вызову CallBack ?
   Кирпич
 
6 - 18.10.19 - 13:17
(4) ну может первый раз она её загружает из d:\, а второй раз может скопировала куда и оттуда загружает
   Santiago
 
7 - 21.10.19 - 10:23
(5)

    case eCallBack:
    {
        if (!lSizeArray || !paParams)
            return false;
        s1 = (paParams)->pwstrVal;
        s2 = (paParams + 1)->pwstrVal;
        //wstring_to_p(std::wstring(s1 + s2), pvarRetValue);


        int answerCode = 0;

                // ВОТ ЭТИ 2 СТРОКИ ОБРАЩАЮТСЯ К ФУНКЦИЯМ ВО ВНЕШНЕЙ DLL

        answerCode = UF_initialize();
        UF_terminate();
                //



            if (answerCode != 1) {
            wstring_to_p(std::wstring(s1), pvarRetValue);
        }
        else {
            wstring_to_p(std::wstring(s2), pvarRetValue);
        }


Если обращение к функция во внешней DLL убрать (2 строчки помеченные комментариями), то все грузится и работает
   Santiago
 
8 - 21.10.19 - 10:32
(7) Повторюсь, все работает и с этими двумя стройками (результатом доволен), но только 1 раз, потом нужно перегрузить платформу 1С. Второй запуск выдает ошибку
   Garykom
 
9 - 21.10.19 - 10:34
Вопрос был что внутри этих двух строчек. Как там работаем с памятью. И судя по terminate еще и очищать сами пытаемся, что с точки зрения ВК для 1С неправильно.

answerCode = UF_initialize();
UF_terminate();
   Garykom
 
10 - 21.10.19 - 10:35
Короче грузи в ВК стороннюю DLL а выгружать не надо, сохраняй между вызовами загруженную и используй.
По крайней мере сглючит только при выходе из 1С (отключении ВК).
   Santiago
 
11 - 21.10.19 - 12:37
(10) Так я и не выгружаю, просто повторно вызываю VK кнопкой, а там уже что то не так...

Может ее грузить нужно глобально где то при старте платформы 1С, а использовать при нажатии кнопки?

Может быть мне поможет способ загрузки через "общие макеты" ? Чем эти два способа отличаются: используемый мной и загрузка через "общие макеты" ?
   arsik
 
12 - 21.10.19 - 12:46
(11) Он тебе про другое говорит.
   Santiago
 
13 - 21.10.19 - 13:11
(12)  Поясните как мне заставить не выгружать стороннюю DLL? Это относится к опциям компилятора?

У меня на руках сама DLL, LIB и h-файлы

Я подключаю заголовочный файл, указываю в компоновщике соответствующий lib файл и собираю.

Запутался в этих дебрях или в двух соснах)
   Кирпич
 
14 - 21.10.19 - 13:17
(13) ты на вопрос в (5) так и не ответил
   Garykom
 
15 - 21.10.19 - 13:20
(13) Убери UF_terminate(); нафик
   Garykom
 
16 - 21.10.19 - 13:21
(15)+ И переделать answerCode = UF_initialize();

Так чтобы инициализация происходила только один раз при подключении ВК (куда сохранять ссылку сам думай), а в eCallBack просто вызов функций из нее.
   Santiago
 
17 - 28.10.19 - 11:53
Очень благодарен разработчикам платформы 1С! Гибкая и универсальная.  

Но все что касается ВнешнейКомпоненты это боль, боль и еще раз боль.

Для решения моей задачи написал легенькое консольное приложение, работаю через ЗапуститьПриложение(). Результат работы возвращается через КодВозврата.
   Garykom
 
18 - 28.10.19 - 11:57
ВК не нужна если задачу можно решить через веб-сервисы.

Для их написания очень удобно использовать Golang, на выходе exe файл который просто запустить и он поднимает веб-сервер на нужном порту.
1С просто через HTTPСоединение работает с этим портом.

Вот если надо обработку внешнего события тут пока никак без ВК или апача/иис.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.