При разработке внешних компонент для платформы 1С:Предприятие по технологии Native API разработчики часто сталкиваются с ситуацией, когда созданный библиотечный файл (DLL) отлично работает на современных операционных системах (Windows 10, Windows Server 2012/2016/2019), однако отказывается запускаться в устаревших средах — Windows XP или Windows Server 2003. В 1С метод ПодключитьВнешнююКомпоненту при этом тихо возвращает Ложь без подробного текста ошибки.
Рассмотрим подробно причины возникновения данной проблемы, разберем порядок подключения компоненты в коде 1С, а также по шагам изучим правильные настройки проекта C++ в MS Visual Studio для обеспечения полной обратной совместимости.
Проанализируем классический фрагмент кода на языке 1С, который используется для вызова и инициализации внешней библиотеки Native API из локального файла на диске:
КодФайла = "D:\Users\Andriy\AddInNative.dll";
ИмяМодуля = "DemoVK";
// Подключаем внешнюю компоненту по технологии Native API
РезультатПодключения = ПодключитьВнешнююКомпоненту(КодФайла, ИмяМодуля, ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
// Создаем объект внешнего расширения
ДемоКомп = Новый("AddIn.DemoVK.AddInNativeExtension");
Иначе
Сообщить("Не удалось подключить внешнюю компоненту Native API!");
КонецЕсли;
Если метод ПодключитьВнешнююКомпоненту возвращает значение Ложь, платформа 1С не может загрузить DLL-файл в адресное пространство процесса (вызов системной функции LoadLibrary завершается ошибкой). Разберем технические причины, почему это происходит именно в Windows XP и Server 2003.
Рассмотрим основные факторы, из-за которых загрузчик Windows NT 5.1/5.2 (XP / Server 2003) отклоняет DLL-файл, скомпилированный в современных версиях Visual Studio:
LoadLibrary ядро Windows XP немедленно блокирует файл с ошибкой ERROR_BAD_EXE_FORMAT (код 193) еще до выполнения кода инициализации./MD), целевая система требует наличия установленного пакета Visual C++ Redistributable именно той версии, в которой собирался модуль. В чистых дистрибутивах Windows XP/2003 этих библиотек по умолчанию нет.kernel32.dll и ntdll.dll, которые появились только в Vista/7 (например, GetTickCount64, InitializeCriticalSectionEx, CreateEventExW). Если таблица импорта (IAT) содержит ссылки на них, ОС не сможет связать вызовы.GetClassObject, DestroyObject, GetClassNames и SetPlatformCapabilities. Если функции не объявлены как extern "C" или не вынесены в .def-файл экспорта, 1С не найдет их.Проанализируем по шагам, какие изменения необходимо внести в конфигурацию проекта Visual Studio, чтобы внешняя компонента успешно загружалась в Windows XP и Windows Server 2003.
Главным условием успешного запуска является использование специального набора инструментов компиляции (Platform Toolset), поддерживающего целевые системы NT 5.x.
Если пункт v110_xp отсутствует, необходимо открыть Visual Studio Installer и установить компонент поддержки Windows XP C++ (Windows XP Support for C++).
В случае прямой сборки через командную строку или линковщик передайте параметру /SUBSYSTEM явно указанную версию системы:
/SUBSYSTEM:WINDOWS,5.01
Для 32-битной системы Windows XP это установит версию подсистемы 5.01, а для Windows Server 2003 — 5.02 (/SUBSYSTEM:WINDOWS,5.02).
Чтобы компонента не требовала предварительной установки пакетов Microsoft Visual C++ Redistributable на клиентской машине, включим статическое связывание с библиотеками CRT:
Многопоточная (/MT) (Multi-threaded).Многопоточная отладочная (/MTd) (Multi-threaded Debug).При такой настройке весь необходимый служебный код C/C++ вшивается непосредственно в итоговый .dll файл, что гарантирует независимость от внешних системных библиотек msvcr*.dll.
Обратите внимание на важные аспекты при сборке релиза:
WS2_32.DLL или сторонние библиотеки обработки изображений), убедитесь, что они либо входят в состав самой ОС Windows XP, либо скомпилированы статически вместе с вашим проектом. Поставляемые внешние DLL необходимо копировать в папку bin платформы 1С.Если после выполнения всех настроек компонента по-прежнему возвращает Ложь, рекомендуем выполнить быструю диагностику с помощью утилиты Dependency Walker (depends.exe).
depends.exe на целевую машину с Windows XP / Server 2003.AddInNative.dll.KERNEL32.DLL).Выполнение описанных шагов по переключению набора инструментов на v110_xp и статической сборке /MT полностью устраняет проблему подключений Native API компонент 1С на старых операционных системах.