Создаем по шагам КОМПАКТНУЮ внешнюю компоненту для 1С:Предприятия за 10 минут (на MS Visual C++ 6.0)
18.10.06
Разработка - Разработка внешних компонент
Сразу оговорюсь, в итоге получится обыкновенный inprocess server, а не "внешняя компонента" в понимании 1С. В этом примере не используется "Технология создания внешних компонент" от 1С (где-то она у меня на старом винте заблудилась - найти не могу), и поэтому описанная ниже технология подходит для задач типа "вы спрашиваете - мы отвечаем".
Напишем простейшую компоненту, возвращающую "случайное" число в заданном диапазоне.
А теперь уменьшим размер 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
Итак, 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);
Сообщить(Всп);
КонецПроцедуры
Пример внешней компоненты
Автор статьи: yu
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.