Как выяснить, почему не загружается внешняя компонента ?
Добрый вечер!
Решил написать элементарную внешнюю компоненту на C++ (VisualSudio).
конфигурация на управляемых формах.
Файл DLL существует. Версия 1С - 8.3.8, учебная (как я понял, в учебной можно использовать внешние компоненты - нельзя COM-соединения).
Загружаю внешнюю компоненту в 1С так:
Получаю сообщение об ошибке - ошибка подключения...
Как выяснить, в чем дело ?
Мой класс C++ - за основу взял template 1C:
Возникли следующие проблемы и вопросы:
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 - в чем тогда проблема ?
Помогите, пожалуйста, двинуться далее в сторону решения проблем, что и где посмотреть - пока не знаю, как ее сдвинуть с места.
Решил написать элементарную внешнюю компоненту на 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 - в чем тогда проблема ?
Помогите, пожалуйста, двинуться далее в сторону решения проблем, что и где посмотреть - пока не знаю, как ее сдвинуть с места.
По теме из базы знаний
- Звоним из «1С». Универсальный софтфон для стандартных конфигураций «1С» с открытым кодом для платформ 8.2, 8.3 для Asterisk и не только.
- Не спеша, эффективно и правильно – путь разработки. Часть 1. Парадигма
- Как мы внедряли электронную инвентаризацию средствами штрихкодирования в учреждениях, у которых нет денег, но все должно быть по высшему разряду
- Типичные ошибки при совершенствовании бизнес-процессов, или Почему автоматизация не всегда помогает достичь реальной эффективности
- Результаты ревью кода 1500+ решений каталога Инфостарт: наиболее частые ошибки разработчиков в коде
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) У меня всё подключилось.
1. Если собираетесь пользоваться отладчиком - соберите проект в режиме debug.
2. Рекомендую первые попытки делать на ТОЛСТОМ клиенте в режиме ОБЫЧНЫХ форм. Разрядность проекта при сборке установите по разрядности клиентского ПО.
3. При подключении внешней компоненты платформа делает около 10 вызовов различных методов Вашей dll, вызов CAddInNative::Init - далеко не самый первый из них (хотя возвращаемое им значение влияет на подключение).
4. Имя класса "CAddInNative" берется из ответа метода GetClassNames() и затем передается в качестве первого параметра в метод GetClassObject(). В примере в списке классов - единственный элемент, а в методе GetClassObject() значение первого параметра никак не анализируется. Если в строке g_kClassNames[] указать несколько имен классов, платформа последовательно выполнит GetClassObject() для каждого из них.
5. Имя компоненты можете задать любое, чтобы отличать разные экземпляры.
6. При создании объекта Новый("Addin.<имя компоненты>.<имя расширения>) именем расширения должно быть то, что возвращает метод CAddInNative::RegisterExtensionAs();
У меня пример из VNCOMP83 после успешной сборки заработал сразу.
1. Если собираетесь пользоваться отладчиком - соберите проект в режиме debug.
2. Рекомендую первые попытки делать на ТОЛСТОМ клиенте в режиме ОБЫЧНЫХ форм. Разрядность проекта при сборке установите по разрядности клиентского ПО.
3. При подключении внешней компоненты платформа делает около 10 вызовов различных методов Вашей dll, вызов CAddInNative::Init - далеко не самый первый из них (хотя возвращаемое им значение влияет на подключение).
4. Имя класса "CAddInNative" берется из ответа метода GetClassNames() и затем передается в качестве первого параметра в метод GetClassObject(). В примере в списке классов - единственный элемент, а в методе GetClassObject() значение первого параметра никак не анализируется. Если в строке g_kClassNames[] указать несколько имен классов, платформа последовательно выполнит GetClassObject() для каждого из них.
5. Имя компоненты можете задать любое, чтобы отличать разные экземпляры.
6. При создании объекта Новый("Addin.<имя компоненты>.<имя расширения>) именем расширения должно быть то, что возвращает метод CAddInNative::RegisterExtensionAs();
У меня пример из VNCOMP83 после успешной сборки заработал сразу.
(3) Подключаю свою компоненту:
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("NativeVK")), "DemoLib", ТипВнешнейКомпоненты.Native);
ВнешняяКомпонента = Новый("AddIn.DemoLib.ExecExtention");
ExecExtention - это ClassName, а вот DemoLib от куда берется? Ни как не могу разобраться.
Подскажите пожалуйста.
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("NativeVK")), "DemoLib", ТипВнешнейКомпоненты.Native);
ВнешняяКомпонента = Новый("AddIn.DemoLib.ExecExtention");
ExecExtention - это ClassName, а вот DemoLib от куда берется? Ни как не могу разобраться.
Подскажите пожалуйста.
(4) Сам нашел решение. ПОЛУЧАЕТСЯ СЛЕДУЮЩЕЕ:
ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("NativeVK")), <<ИмяПередаваемое>>, ТипВнешнейКомпоненты.Native);
ВнешняяКомпонента = Новый("AddIn.<<ИмяПередаваемое>>.ExecExtention");
ExecExtention - это ClassName, GetClassNames() - ответ функции.
ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("NativeVK")), <<ИмяПередаваемое>>, ТипВнешнейКомпоненты.Native);
ВнешняяКомпонента = Новый("AddIn.<<ИмяПередаваемое>>.ExecExtention");
ExecExtention - это ClassName, GetClassNames() - ответ функции.
(5) Скорее всего, у Вас функции GetClassNames() и CAddInNative::RegisterExtensionAs() выдают одно и то же значение, поэтому и подключение удалось. У меня эти значения - разные, при создании нового объекта внешней компоненты в 1С третья часть параметра - имя расширения, выдаваемое функцией CAddInNative::RegisterExtensionAs().
В примере 1С GetClassNames() выдает строку "CAddInNative",
а CAddInNative::RegisterExtensionAs() - строку "AddInNativeExtension"
объект в 1С для примера создается командой
ВнешняяКомпонента = Новый("AddIn.<<ИмяПередаваемое>>.AddInNativeExtension");
В примере 1С GetClassNames() выдает строку "CAddInNative",
а CAddInNative::RegisterExtensionAs() - строку "AddInNativeExtension"
объект в 1С для примера создается командой
ВнешняяКомпонента = Новый("AddIn.<<ИмяПередаваемое>>.AddInNativeExtension");
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот