gifts2017

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

Опубликовал Доржи Цыденов (support) в раздел Программирование - Практика программирования

Сразу оговорюсь, в итоге получится обыкновенный 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
А вот код внешней обработки, использующей эту dll-ку:

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Олег Пономаренко (O-Planet) 18.10.06 03:06
Хм... Вот бы на дельфях. Но скачал, попробую...
2. yu (yu) 18.10.06 10:41
Я бы не сказал что автор неизвестен ;-)
Это моя крошечная статейка середины 2002 года
3. Доржи Цыденов (support) 18.10.06 10:57
Вот, как здорово! А у нас только ящик был my1c@mailru.com, но он уже не существует. Представьтесь, мы подправим автора и ссылку дадим на Ваш сайт.
4. yu (yu) 18.10.06 11:03
Да, был такой ящик раньше. Собственно, зачем представляться-то, у меня здесь профайл уже есть.
5. Илья 19.10.06 21:07
Но это же не внешняя компонента. Зачем в заголовке неправду писать?
6. Герман (German) 11.12.06 16:21
Да...у меня и на VS2005 этот фокус удался
7. VasilyKushnir (vasilykushnir) 11.12.06 17:26
Поддерживаю O-Planet - на Дельфях бы...
8. VasilyKushnir (vasilykushnir) 12.12.06 08:50
Хотя... Появится время, попробую на 7-е делфи перевести пример.
9. Андрей (sttt) 31.01.07 09:57
10. Герман (German) 05.03.07 14:13
http://ifolder.ru/1282415
Проект на VC2005 и пример обработки 1c8.0
11. Доржи Цыденов (support) 06.03.07 08:37
12. kairat primbetov (karat60) 01.10.07 13:21
13. Вячеслав Н. Бойко (boy13) 28.05.09 18:55
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа