Имя: Пароль:
1C
1С v8
Внешняя компонента использует стороннюю DLL
0 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, все работает хорошо и без ошибок

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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