Почему внешняя компонента Native API 1С не подключается в Windows XP и Windows Server 2003 и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних компонент для платформы 1С:Предприятие по технологии Native API разработчики часто сталкиваются с ситуацией, когда созданный библиотечный файл (DLL) отлично работает на современных операционных системах (Windows 10, Windows Server 2012/2016/2019), однако отказывается запускаться в устаревших средах — Windows XP или Windows Server 2003. В 1С метод ПодключитьВнешнююКомпоненту при этом тихо возвращает Ложь без подробного текста ошибки.

Рассмотрим подробно причины возникновения данной проблемы, разберем порядок подключения компоненты в коде 1С, а также по шагам изучим правильные настройки проекта C++ в MS Visual Studio для обеспечения полной обратной совместимости.

Как выглядит подключение Native API компоненты в 1С

Проанализируем классический фрагмент кода на языке 1С, который используется для вызова и инициализации внешней библиотеки Native API из локального файла на диске:


КодФайла = "D:\Users\Andriy\AddInNative.dll";
ИмяМодуля = "DemoVK";

// Подключаем внешнюю компоненту по технологии Native API
РезультатПодключения = ПодключитьВнешнююКомпоненту(КодФайла, ИмяМодуля, ТипВнешнейКомпоненты.Native);

Если РезультатПодключения Тогда
    // Создаем объект внешнего расширения
    ДемоКомп = Новый("AddIn.DemoVK.AddInNativeExtension");
Иначе
    Сообщить("Не удалось подключить внешнюю компоненту Native API!");
КонецЕсли;

Если метод ПодключитьВнешнююКомпоненту возвращает значение Ложь, платформа 1С не может загрузить DLL-файл в адресное пространство процесса (вызов системной функции LoadLibrary завершается ошибкой). Разберем технические причины, почему это происходит именно в Windows XP и Server 2003.

Выясняем причины отказа загрузки DLL в старых ОС

Рассмотрим основные факторы, из-за которых загрузчик Windows NT 5.1/5.2 (XP / Server 2003) отклоняет DLL-файл, скомпилированный в современных версиях Visual Studio:

  1. Несовместимая версия подсистемы в PE-заголовке (Subsystem Version). Начиная с Visual Studio 2012, компилятор C++ по умолчанию прописывает в заголовках исполняемых файлов минимальную версию ОС 6.00 (Windows Vista) или 6.02 (Windows 8). При попытке вызова LoadLibrary ядро Windows XP немедленно блокирует файл с ошибкой ERROR_BAD_EXE_FORMAT (код 193) еще до выполнения кода инициализации.
  2. Зависимость от динамического рантайма C/C++ (MSVCRT). Если проект собран с динамической линковкой библиотеки Runtime (параметр /MD), целевая система требует наличия установленного пакета Visual C++ Redistributable именно той версии, в которой собирался модуль. В чистых дистрибутивах Windows XP/2003 этих библиотек по умолчанию нет.
  3. Вызов отсутствующих системных функций API. Современный стандарт CRT запрашивает функции kernel32.dll и ntdll.dll, которые появились только в Vista/7 (например, GetTickCount64, InitializeCriticalSectionEx, CreateEventExW). Если таблица импорта (IAT) содержит ссылки на них, ОС не сможет связать вызовы.
  4. Искажение имен экспортируемых C++ функций (Name Mangling). Для Native API платформа 1С ожидает чистые C-имена точек входа: GetClassObject, DestroyObject, GetClassNames и SetPlatformCapabilities. Если функции не объявлены как extern "C" или не вынесены в .def-файл экспорта, 1С не найдет их.

Пошаговое решение проблемы в Visual Studio

Проанализируем по шагам, какие изменения необходимо внести в конфигурацию проекта Visual Studio, чтобы внешняя компонента успешно загружалась в Windows XP и Windows Server 2003.

Шаг 1. Переключение набора инструментов на режим совместимости с Windows XP

Главным условием успешного запуска является использование специального набора инструментов компиляции (Platform Toolset), поддерживающего целевые системы NT 5.x.

  1. Откройте проект внешней компоненты в MS Visual Studio.
  2. Зайдите в меню Проект (Project) > Свойства (Properties).
  3. Перейдите в раздел Свойства конфигурации (Configuration Properties) > Общие (General).
  4. В поле Набор инструментов платформы (Platform Toolset) выберите значение с суффиксом XP, например: Visual Studio 2012 - Windows XP (v110_xp) или v141_xp (в зависимости от вашей версии Visual Studio).

Если пункт 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).

Шаг 2. Включение статической линковки C Runtime Library

Чтобы компонента не требовала предварительной установки пакетов Microsoft Visual C++ Redistributable на клиентской машине, включим статическое связывание с библиотеками CRT:

  1. В свойствах проекта перейдите в раздел C/C++ > Код генерации (Code Generation).
  2. В поле Библиотека времени выполнения (Runtime Library) установите:
    • Для конфигурации Release: Многопоточная (/MT) (Multi-threaded).
    • Для конфигурации Debug: Многопоточная отладочная (/MTd) (Multi-threaded Debug).

При такой настройке весь необходимый служебный код C/C++ вшивается непосредственно в итоговый .dll файл, что гарантирует независимость от внешних системных библиотек msvcr*.dll.

Шаг 3. Сборка финального релиза и проверка сторонних библиотек

Обратите внимание на важные аспекты при сборке релиза:

  1. Всегда собирайте финальную DLL в конфигурации Release под целевую разрядность платформы 1С. Помните, что если клиент 1С:Предприятие 32-битный (x86), то и DLL должна быть строго 32-битной, даже если сама Windows XP/10 имеет 64-битный разряд.
  2. Если ваша компонента использует дополнительные библиотеки (например, сетевой сокет WS2_32.DLL или сторонние библиотеки обработки изображений), убедитесь, что они либо входят в состав самой ОС Windows XP, либо скомпилированы статически вместе с вашим проектом. Поставляемые внешние DLL необходимо копировать в папку bin платформы 1С.

Способ диагностики проблем с помощью Dependency Walker

Если после выполнения всех настроек компонента по-прежнему возвращает Ложь, рекомендуем выполнить быструю диагностику с помощью утилиты Dependency Walker (depends.exe).

  1. Скопируйте утилиту depends.exe на целевую машину с Windows XP / Server 2003.
  2. Запустите утилиту и откройте скомпилированный AddInNative.dll.
  3. Проанализируйте раздел Import Address Table (IAT). Утилита подсветит красным цветом отсутствующие системные библиотеки, а также точки входа в функцию (например, попытки вызова несуществующих функций API в KERNEL32.DLL).

Выполнение описанных шагов по переключению набора инструментов на v110_xp и статической сборке /MT полностью устраняет проблему подключений Native API компонент 1С на старых операционных системах.

← На главную