Создаем по шагам КОМПАКТНУЮ внешнюю компоненту
для 1С:Предприятия за 10 минут
(на MS Visual C++ 6.0)

Полный архив этой статьи


    Сразу оговорюсь, в итоге получится обыкновенный inprocess server, а не "внешняя компонента" в понимании 1С. В этом примере не используется "Технология создания внешних компонент" от 1С (где-то она у меня на старом винте заблудилась - найти не могу), и поэтому описанная ниже технология подходит для задач типа "вы спрашиваете - мы отвечаем".

Напишем простейшую компоненту возвращающую "случайное" число в заданном диапазоне.

Рисунок 1
Рисунок 2
Рисунок 3
Рисунок 4
Рисунок 5
Рисунок 6
Рисунок 7
Вот и всё!

А теперь уменьшим размер dll-ки в несколько раз настройками компилятора...

Итак, Project -> Settings.

1. Закладка С/С++
Category: General
Optimizations: Minimize size
Debug info: None
Preprocessor definitions: WIN32,_WINDOWS,_MBCS,_USRDLL - т.е. убрали _DEBUG

Category: Code generation
Use run-time library: Multithreated DLL

Category: Optimizations
Optimizations: Minimize size

2. Закладка Link
Category: General
Убираем галку с Generate debug info
Убираем галку с Link incrementally

3. Закладка Resources
Убрать из Preprocessor definitions - _DEBUG

Если теперь скомпилить вылезет ошибка: что-то вроде опции /O1 и /GZ не могут
жить вместе. Ну не могут и не надо. Идем на закладку С/С++ и в Project Options
ручками удаляем опцию /GZ.

Если после этого скомпилить проект его размер составит ~ 28 килобайт.
Уже неплохо. А теперь добавим две "волшебные" ;-) строчки в наш проект.

Они также есть на последнем рисунке:

#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text")

Означают эти строчки следующее: задать секциям PE файла выравнивание 512 байт (а
не 4096 по умолчанию) и объединить секции .rdata & .text

Внимание! Выравнивание менее 512 байт делать не стоит, т.к. такая
программа не пойдет под Windows NT/2000/XP.

Итак, компилим, получаем dll-ку размером 12800 байт. Занавес.

Ах, да! Совсем забыл для чего всё это затевалось! Теперь эту dll-ку можно
использовать как внешнюю компоненту 1С:Предприятия, предварительно зарегистрировав
на компьютере при помощи команды: regsvr32 example.dll


А вот код внешней обработки использующей эту dll-ку:

//*******************************************
Процедура Сформировать()
  В=СоздатьОбъект("example.Random");
  // Random возвращает значение от 0 до 1000 в данном случае
  Всп=В.GetRandomValue(1000);
  Сообщить(Всп);
КонецПроцедуры

Скачать проект для Visual C++ (~ 26 kb в архиве)
Скачать только dll-ку (~ 6 kb в архиве)

Давайте писать компактные программы!

E-mail