DLL-Loader: ВК для 1С

09.12.11

Разработка - Разработка внешних компонент

Иногда хочется с минимальными усилиями добавить какой-нибудь интересный метод для работы с 1С, но писать каждый раз компоненту по технологии создания внешних компонент (ТСВК) от 1С достаточно трудоемко, да и иногда просто лень разбираться. Между тем, написать обычную (не COM, и не AciveX)  DLL в состоянии практически любой программист. Кроме того, использование обычной DLL имеет несомненный плюс, заключающийся в отсутствии регистрации ее в реестре, что снимает проблемы  недостаточности прав у пользователей без локальных административных прав на данную машину.

 

Качать по ссылке: http://dev.1tsm.ru/project/132

    Настоящая компонета написана по ТСВК и позволяет использовать любые методы обычной DLL, написанной по определенным, несложным правилам.

  Компонента имеет метод:

CallDllMethod(ПолноеИмяОбычнойDLL,ИмяМетода,Параметр1,Параметр2,Параметр3,Параметр4,Параметр5);

где:

ПолноеИмяОбычнойDLL,ИмяМетода - тип значения строка

Параметр1-Параметр5 - параметры, принимаемые методом обычной DLL, любой тип значения (variant)

Возвращаемое значение -  любой тип значения (variant)

Все параметры обязательны, если в вызываемом методе простой DLL используются не все пять параметров (Параметр1-Параметр5), неиспользуемым параметрам можно присвоить любое значение:

0, "", Неопределено (в 8х) и т.п. 

Пример:

ПутьDLL=КаталогИБ()+"SampleDLL.dll";

CallDllMethod(ПутьDLL,"ConcatStrings","Раз+","Два+","Три+","Четыре+","Пять"); - все параметры используются

CallDllMethod(ПутьDLL,"ProcessInfo","","","","",""); -параметры не используются.

Обычную DLL можно писать на любом языке.

Кроме того, бонусный метод (только для 8х, в 7.7 тип этой переменной не поддерживается)

Get_IAsyncEvent(); - возвращает ссылку на интерфейс 1С IAsyncEvent, что позволяет в дальнейшем

генерировать любые внешние события прямо из кода 1С

Содержание архива:

DLL_LOADER.dll  - собственно файл самой ВК

SampleDLL.dll - пример обычной DLL, методы которой вызываются из DLL_LOADER

SampleDLLSource  - папка с исходниками обычной DLL (Delphi7, код прокомментирован)

DLL_LoaderTest.epf - тестовая обработка 8.1

DDL_LOADER_TEST.ert  -тестовая обработка 7.7

Примечание: это и есть readme

Скачать без ограничений можно здесь: http://dev.1tsm.ru/project/132

Метод добавлен в MiracleV8http://dev.1tsm.ru/project/110

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52098    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26242    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44974    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35075    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    53997    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30839    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4037    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4777    starik-2005    32    

39
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
0. Abadonna 3958 14.06.11 07:42 Сейчас в теме
Иногда хочется с минимальными усилиями добавить какой-нибудь интересный метод для работы с 1С, но писать каждый раз компоненту по технологии создания внешних компонент (ТСВК) от 1С достаточно трудоемко, да и иногда просто лень разбираться. Между тем, написать обычную (не COM, и не AciveX) DLL в состоянии практически любой программист. Кроме того, использование обычной DLL имеет несомненный плюс, заключающийся в отсутствии регистрации ее в реестре, что снимает проблемы недостаточности прав у пользователей без локальных административных прав на данную машину.


Перейти к публикации

1. Арчибальд 2706 14.06.11 07:42 Сейчас в теме
Хоть бы кто высказался :o
5. Abadonna 3958 14.06.11 08:51 Сейчас в теме
(1)
Хоть бы кто высказался

_____________________________________
— Пардон! — отозвался Фагот. — Я извиняюсь, здесь разоблачать нечего, все ясно.

(с) Булгаков ;)
2. 1cmax 152 14.06.11 07:53 Сейчас в теме
Скачал, но еще не проверял, за идею +
3. vkr 14.06.11 08:05 Сейчас в теме
(0) Уважаемый Абадонна !
Правильно ли я понимаю, что, если у меня есть свои DLL-ки, написанные на С++ и Ассемблере (ну, типа,
для графики и обмена данными), то можно их спокойно пристегнуть к 1С-базе с помощью Вашего "посредника" ?
Если да, то это просто бальзам на душу... :)
Жаль, что +100 тут не допускается...
4. Abadonna 3958 14.06.11 08:38 Сейчас в теме
(3) Просто так пристегнуть не получится.
Функции Вашей длл обязательно должны быть полностью аналогичны по параметрам из файла-примера *.dpr
Но уж внутрь туда можно спокойно накопипастить всё из тех длл
6. vkr 14.06.11 09:51 Сейчас в теме
(4) Да у меня, насколько помню (давно было :))
больше трех входных параметров и не использовалось.
И вообще старался через адреса блоков параметров работать...
7. Abadonna 3958 14.06.11 10:25 Сейчас в теме
(6) Параметров пять я взял с супер запасом. Но дело не только в количестве.
Самое главное, каждая функция должна иметь именно такой вид, и никакой иначе
function ИмяФункции(param1,param2,param3,param4,param5:olevariant):olevariant; stdcall;
Т.е. параметров обязательно 5 (другое дело, что их можно не использовать), параметры обязательно вариантного типа, возвращаемое значение - тоже вариантного типа. Иначе сам DLL_Loader не поймет, что он вызывает.
А уж в внутри этой функции в нашей обычной DLL можем писать, что угодно, используя (или не используя) param1-param5.
Можно, например, из нее вызвать "родную" функцию, скопированную из другой длл, передав в нее что надо через param1-param5.
Т.е. получится еще одна прокладка: DLL_LOADER вызвал экспортную функцию нашей обычной DLL, эта функция вызвала скопированную откуда-нибудь
неэскпортную функцию, результат вернула в LOADER, а уж тот - в 1С.
Может, излишне подробно написал, но во избежание ;)
Кстати, вчера поленился проверить, думаю, что в нашей экспортной функции можно через LoadLibrary вызвать еще какую-нибудь dll, вызвать метод, и вернуть результат в LOADER-1C
8. Ne'я 14.06.11 14:05 Сейчас в теме
10. cool.vlad4 2 14.06.11 14:18 Сейчас в теме
(8) я думаю, что нет, dynwrap не ВК, а просто com компонента...
9. Abadonna 3958 14.06.11 14:08 Сейчас в теме
(9) Первый раз про такой слышу...
11. cool.vlad4 2 14.06.11 14:19 Сейчас в теме
это ВКwrap ...прикольно...
12. Abadonna 3958 14.06.11 14:20 Сейчас в теме
Именно, чтобы уйти от мерзкого regsvr32 я и освоил в свое время ТСВК.
ЗагрузитьВнешююКомпоненту как-то поприличнее будет (в контексте 1С)
13. Ne'я 14.06.11 14:20 Сейчас в теме
а принципиальные отличия - все-таки, для чайника?
14. Abadonna 3958 14.06.11 14:32 Сейчас в теме
(13) Отличия от чего? От неизвестной мне доселе dynwrap?
Ну ладно, сходу:
Библиотека является результатом труда нескольких разработчиков.
Вчера утром в голову @@нуло, в обед было готово.
Родные интерфейсы 1С (тот же IAsyncEvent) dynwrap получит? Да никогда.
Ну и т.д. А что идеи примерно совпали - дык все идеи в воздухе витают
15. Ne'я 14.06.11 14:36 Сейчас в теме
:D Прошу считать мой неловкий вопрос желанием разобраться в отличиях ВК и СОМ.
16. Abadonna 3958 14.06.11 14:41 Сейчас в теме
ВК - может быть и COM, и АсtiveX, и просто dll
Смотря применительно к чему. В данном случае DLL_LOADER - COM, но со стандартной загрузкой в 1С. Если к нему приделать, например, afx-окно, он будет уже фактически ActiveX.
MiracleV8 - фактический ActiveX, но с возможностью стандартной загрузки. Тем не менее, к ее методам (так 1С сама по ЗагрузитьВнешнююКомпоненту производит регистрацию в реестре)
можно обращаться и из любых других программ, из той же Дельфи через CreateOleObject
17. Ne'я 14.06.11 16:56 Сейчас в теме
Кроме того, использование обычной DLL имеет несомненный плюс, заключающийся в отсутствии регистрации ее в реестре, что снимает проблемы недостаточности прав у пользователей без локальных административных прав на данную машину

Если я правильно поняла, по крайней мере, для 7-ки, у пользователя, не имеющего прав на регистрацию dll в реестре нужно строить трехэтажную конструкцию из vkloader-а, dllloader-а и конкретной dll?
А с 8-кой эта проблема так и остается неразрешимой?
18. Abadonna 3958 14.06.11 17:04 Сейчас в теме
(17) vkloader разве не требует регистрации? что-то одно уже должно быть зарегено под полными правами. Или vkloader, или dllloader, или та же MiracleV8, у которой есть метод
RunAs, который позволяет запустить любую прогу (в т.ч. и regsvr32) от имени и с паролем админа.
Кстати, обычная V7Plus тоже фиг зарегится/запустится без локальных админских прав.
А с 8-кой эта проблема так и остается неразрешимой?

Это вовсе не проблема 1С, а параметры безопасности Windows и Вашей сетевой политики. Лично мы у себя и в страшном сне представить не можем, чтобы юзверь самолично себе на комп какой софт захотел - такой и поставил. Если каждому юзверишке позволить запись в реестр - это и подумать страшно :(
19. Ne'я 14.06.11 17:06 Сейчас в теме
vkloader (далее ВК) - внешняя компонента для 1С-Предприятия 7.7, которая может загружаться без ее регистрации в реестре, и загружать другие внешние компоненты без их регистрации. Предназначена для беспроблемной загрузки внешних компонент пользователями, не имеющими прав на запись в HKCR ветку реестра.

Это из http://openconf.1cpp.ru/vk/vkloader/
21. Abadonna 3958 14.06.11 17:17 Сейчас в теме
(19)Используем вот это Запуск от имени
и никогда никаких проблем с отсутствующими правами.
Если говорить о терминалке (а по серьезному я и не вижу другого использования 1С, а если несерьезно - но можно юзверям и права дать), то там достаточно один раз админу запустить 1С с ЗагрузитьВнешнююКомпоненту и оно прорегится для всех.
20. Abadonna 3958 14.06.11 17:06 Сейчас в теме
+[7]
то в нашей экспортной функции можно через LoadLibrary вызвать еще какую-нибудь dll

Не поленился, сейчас только проверил. Добавил в SampeDLL
{устанавливает прозрачность главного окна 1С 0(невидимо)-255(полностью непрозрачно) /param1/}
function SetMainTransparency(param1, param2, param3, param4, param5: olevariant): olevariant; stdcall;
const LWA_COLORKEY = $00000001;
const LWA_ALPHA = $00000002;
const WS_EX_LAYERED = $00080000;
var AStyle: Integer;
var user32: UINT;
var _SetLayeredWindowAttributes: function(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;

begin
  user32 := LoadLibrary('user32');
   if user32 <> 0 then begin
    @_SetLayeredWindowAttributes := GetProcAddress(user32, 'SetLayeredWindowAttributes');
    if @_SetLayeredWindowAttributes <> nil then begin
      AStyle := GetWindowLong(GetActiveWindow, GWL_EXSTYLE);
      if (AStyle and WS_EX_LAYERED) = 0 then SetWindowLong(GetActiveWindow, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
      _SetLayeredWindowAttributes(GetActiveWindow, 0, param1, LWA_ALPHA);
    end;
  end;

  RESULT := S_OK;
end;
Показать

Результат на картинке, сквозь главное окно даже код в конфигураторе видно, которым она вызывается ;)
Блин, сайт оформатировал, как его не просили. const LWA_COLORKEY = Доллар(hex-число)00000001;
Ниже то же самое для LWA_ALPHA и WS_EX_LAYERED
Прикрепленные файлы:
22. Abadonna 3958 15.06.11 15:28 Сейчас в теме
Для пользователей Miracle: приделал метод, версия 2.1.2.2
MiracleV8
Вызов, работа - один в один, как тут
23. 1yh1 15.06.11 17:25 Сейчас в теме
Может пригодиться. Даже когда-то нужна была.
А нельзя ли, так написать, чтобы не специальную dll писать, а пользоваться уже имеющимися, например так:
DLL.CallDLLMethod("my.dll", "spec_function", 132, "int32", 132, "int32", "Текст", "wchar*" и ещё аргументов)
либо вместо "spec_function" писать номер импортируемой функции "#3"

а вообще-то в dynwrap это есть
24. ValeriVP 1303 15.06.11 18:19 Сейчас в теме
вот было бы Native и возможности как у dynwrap - цены бы небыло. а так - поделка, не более.
26. Abadonna 3958 15.06.11 18:23 Сейчас в теме
(24) О каких возможностях dynwrap идет речь?
Вызывать API? Так в примере практически одни API и вызываются. Какие еще возможности нужны?
27. ValeriVP 1303 21.06.11 12:20 Сейчас в теме
(26)dynwrap обеспечивает работу с любой DLL, а не только с теми, у которых в функциях по 5 параметров
28. Abadonna 3958 21.06.11 13:05 Сейчас в теме
(27) Типа слышал звон, а не знаю, где он?
Пять параметров это в транзитной функции, которая дальше может вызывать, что угодно, и с какими угодно параметрами.
Малой кровью, и ноль трудами обошелся.
А в общем, не нравится - не ешь.
Тем более, я это просто как метод в Миракл прикрутил, а уж та общается... с чем только не общается...
29. cool.vlad4 2 21.06.11 13:13 Сейчас в теме
(27) а как вы события будете отлавливать? COM компонента (или ActiveX) и ВК от фирмы 1С это разные вещи...зачем их сравнивать
25. ValeriVP 1303 15.06.11 18:20 Сейчас в теме
не вижу широких возможностей применения
30. Душелов 4013 28.06.11 16:22 Сейчас в теме
Помнится делал я подобное, но только для .NET-овских контролов, с отловом событий.
А идея да, хороша )
31. Tahallus 431 15.08.11 10:56 Сейчас в теме
Ошибка при вызове метода контекста (Get_IAsyncEvent): Произошла исключительная ситуация (0x8000ffff)
ИнтерфейсСобытий=LL.Get_IAsyncEvent();
по причине:
Произошла исключительная ситуация (0x8000ffff)

А как с этим бороться? вышло под 8.1
32. Abadonna 3958 01.10.11 05:00 Сейчас в теме
(31)
ИнтерфейсСобытий=LL.Get_IAsyncEvent();

До этого на 8.1 не проверял, сейчас раз 20 нажал кнопку - никаких проблем.
Прикрепленные файлы:
33. Tota 25.10.11 18:29 Сейчас в теме
Количество параметров бы расширить, а то 5 не хватает.
35. Abadonna 3958 25.10.11 18:32 Сейчас в теме
(33) Как не пытался придумать, даже для пяти применения найти не смог. Вон в винапи практически двумя дело обходится: Lparam да WParam. В параметр же что угодно затолкать можно, хоть тот же самый СписокЗначений в одноэсовской терминологии
37. Abadonna 3958 25.10.11 19:01 Сейчас в теме
(33)+/35/ Подсказать, как СТО параметров передать? ;) Делаешь в 1С СписокЗначений, заполняешь там сто значений, и передавай ПЕРВЫМ параметром, а в своей либе уже обрабатывай через TStringList, например. Так что четыре остальных у тебя даже без дела останутся.
34. Tota 25.10.11 18:31 Сейчас в теме
Так всё таки можно ли использовать Events?
36. Abadonna 3958 25.10.11 18:34 Сейчас в теме
(34) У меня на 8.1 и на 8.2 events без проблем работает. Воссоздать ситуёвину, когда он не работает, так и не получилось. Но не особо-то и старался...
38. netroot 11.11.11 14:37 Сейчас в теме
Здравствуйте. Уважаемый автор, скажите оптимизирована ли данная ВК под периодический вызов одной и той же функции из одной и той же dll? Т.е. при каждом ли вызове метода CallDLLMethod вызываются LoadLibrary и GetProcAdress? Спасибо.
39. Abadonna 3958 11.11.11 15:11 Сейчас в теме
(38)
Т.е. при каждом ли вызове метода CallDLLMethod вызываются LoadLibrary и GetProcAdress?

Именно так. Не заморачивался ;)
Кстати, и не советую эту использовать, лучше скачать MiracleV8. Там этот метод прикручен, но много еще всяких вкусностей
42. jdan 8 26.12.12 07:25 Сейчас в теме
Как можно через DLL_LOADER.dll загрузить dll которая имеет class примерно так:



ЗагрузитьВнешнююКомпоненту("DLL_LOADER.dll");
LL=ПолучитьCOMОбъект("","AddIn.DLL_LOADER_CLASS");



//для примера грузим DLL_LOADER.dll в ней есть класс
DLL_LOADER_CLASS



ПутьDLL="
DLL_LOADER.dll
";



// а тут хотелось бы вызвать AboutDLL
через class
DLL_LOADER_CLASS

А=LL.CallDllMethod(ПутьDLL,"
DLL_LOADER_CLASS
:: AboutDLL",Неопределено,Неопределено,Неопределено,Неопределено,Неопределено);



//Естественно у меня в реальности своя DLL и вызывать саму себя DLL_LOADER.dll
нет необходимости, так для примера

Спасибо с уважением Сергей



sk7777@yandex.ru(39)
40. alexkl 09.12.11 07:40 Сейчас в теме
Удивительная вещь специализация - вызывает к жизни посредников для сокращения затрат
41. fixin 4252 06.07.12 14:39 Сейчас в теме
Разочарован. Прочитал громкое название, думал можно готовую любую DLL вызывать, а оказалось только функции по 5 параметров можно, увы...
Придется юзать DynaWrap, спасибо за наводку комментаторам.
Абадона, сделай вызов типизированных параметров, будет удобнее.
Писать DLL-посредник - это не для 1сников, тут и так мозги кипят...
43. tailer2 23.01.18 18:43 Сейчас в теме
не работают ссылки на скачать
44. grog 02.07.20 15:30 Сейчас в теме
45. пользователь 04.02.21 06:26
Сообщение было скрыто модератором.
...
Оставьте свое сообщение