Как выяснить, почему не загружается внешняя компонента ?

1. LUN2 26.09.24 21:15 Сейчас в теме
Добрый вечер!
Решил написать элементарную внешнюю компоненту на C++ (VisualSudio).
конфигурация на управляемых формах.

Файл DLL существует. Версия 1С - 8.3.8, учебная (как я понял, в учебной можно использовать внешние компоненты - нельзя COM-соединения).

Загружаю внешнюю компоненту в 1С так:

    DLL = "d:\ExtComp1.dll";
    Имякомпоненты = "CAddInNative";
    КомпонентаПодключена = ПодключитьВнешнююКомпоненту(DLL, Имякомпоненты, ТипВнешнейКомпоненты.Native);
    если не КомпонентаПодключена тогда
        сообщить("Ошибка подключения компоненты.");
        возврат;
    конецесли;



Получаю сообщение об ошибке - ошибка подключения...
Как выяснить, в чем дело ?

Мой класс C++ - за основу взял template 1C:

 class CAddInNative : public IComponentBase
{
...


Возникли следующие проблемы и вопросы:

1) Можно ли получить какое-то расширенное сообщение об ошибке - что не нашла 1С, что ей не понравилось ?

2) Правильно ли я понимаю, что мой класс в C++ "CAddInNative" - это и есть
имя компоненты ?

3) Все, что я предлагаю 1С для загрузки - это DLL.
Макета с двоичными данными, манифеста, других файлов я не создавал.
Достаточно ли только файла DLL ?

4) Решил посмотреть в отладчике VS - запускается ли CAddInNative::Init, который должен вроде запускаться первым, но не тут-то было.
В VS я собираю проект, создается моя DLL, запускаю конфигуратор 1С, потом через него - саму платформу 1С,
В отладчике VS даю команду - присоединиться к процессу. Здесь все OK,
однако когда ставлю точку останова в этом ...::Init отладчик VS говорит, что попадание в нее не произойдет - нет
отладочных символов.
Однако я не собирал проект VS для Debug x64, т.е. для отладки и вижу, что файл отладочных символов *.PDB лежит в той же папке, что и PDB - в чем тогда проблема ?

Помогите, пожалуйста, двинуться далее в сторону решения проблем, что и где посмотреть - пока не знаю, как ее сдвинуть с места.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. gml 18.12.24 21:07 Сейчас в теме
(1) У меня всё подключилось.

1. Если собираетесь пользоваться отладчиком - соберите проект в режиме debug.
2. Рекомендую первые попытки делать на ТОЛСТОМ клиенте в режиме ОБЫЧНЫХ форм. Разрядность проекта при сборке установите по разрядности клиентского ПО.
3. При подключении внешней компоненты платформа делает около 10 вызовов различных методов Вашей dll, вызов CAddInNative::Init - далеко не самый первый из них (хотя возвращаемое им значение влияет на подключение).
4. Имя класса "CAddInNative" берется из ответа метода GetClassNames() и затем передается в качестве первого параметра в метод GetClassObject(). В примере в списке классов - единственный элемент, а в методе GetClassObject() значение первого параметра никак не анализируется. Если в строке g_kClassNames[] указать несколько имен классов, платформа последовательно выполнит GetClassObject() для каждого из них.
5. Имя компоненты можете задать любое, чтобы отличать разные экземпляры.
6. При создании объекта Новый("Addin.<имя компоненты>.<имя расширения>) именем расширения должно быть то, что возвращает метод CAddInNative::RegisterExtensionAs();


У меня пример из VNCOMP83 после успешной сборки заработал сразу.
3. gml 18.12.24 21:25 Сейчас в теме
(1) На клиенте у меня работало подключение внешней компоненты из файла .dll (без манифеста) Для такого подключения обязательно задайте третий параметр метода ПодключитьВнешнююКомпоненту ТипВнешнейКомпоненты.Native.
4. MissionOnly 3 19.12.24 09:54 Сейчас в теме
(3) Подключаю свою компоненту:

ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("NativeVK")), "DemoLib", ТипВнешнейКомпоненты.Native);

ВнешняяКомпонента = Новый("AddIn.DemoLib.ExecExtention");

ExecExtention - это ClassName, а вот DemoLib от куда берется? Ни как не могу разобраться.

Подскажите пожалуйста.
5. MissionOnly 3 19.12.24 10:16 Сейчас в теме
(4) Сам нашел решение. ПОЛУЧАЕТСЯ СЛЕДУЮЩЕЕ:

ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("NativeVK")), <<ИмяПередаваемое>>, ТипВнешнейКомпоненты.Native);

ВнешняяКомпонента = Новый("AddIn.<<ИмяПередаваемое>>.ExecExtention");

ExecExtention - это ClassName, GetClassNames() - ответ функции.
6. gml 19.12.24 19:38 Сейчас в теме
(5) Скорее всего, у Вас функции GetClassNames() и CAddInNative::RegisterExtensionAs() выдают одно и то же значение, поэтому и подключение удалось. У меня эти значения - разные, при создании нового объекта внешней компоненты в 1С третья часть параметра - имя расширения, выдаваемое функцией CAddInNative::RegisterExtensionAs().

В примере 1С GetClassNames() выдает строку "CAddInNative",
а CAddInNative::RegisterExtensionAs() - строку "AddInNativeExtension"

объект в 1С для примера создается командой
ВнешняяКомпонента = Новый("AddIn.<<ИмяПередаваемое>>.AddInNativeExtension");
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот