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

См. также

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

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

2400 руб.

04.05.2018    46846    122    66    

66

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

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

3000 руб.

12.05.2020    28278    138    100    

90

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

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    3420    2    0    

4

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

Внешняя компонента в виде библиотеки (.dll файл), позволяющая посылать команды и получать ответы по протоколу WebSocket из 1С. Компонента работает только на стороне "клиента".

4440 руб.

22.06.2020    18165    18    33    

22

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

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

1500 руб.

17.09.2018    36512    113    127    

114

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

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

26.01.2024    6846    starik-2005    32    

44

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

Пример взаимодействия 1С с Apach Kafka посредством внешней компоненты, разработанной на основе официальной библиотеки librdkafka (the Apache Kafka C/C++ client library).

22.11.2023    4411    88    ivan1703    26    

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


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

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

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

(с) Булгаков ;)
2. 1cmax 153 14.06.11 07:53 Сейчас в теме
Скачал, но еще не проверял, за идею +
3. vkr 14.06.11 08:05 Сейчас в теме
(0) Уважаемый Абадонна !
Правильно ли я понимаю, что, если у меня есть свои DLL-ки, написанные на С++ и Ассемблере (ну, типа,
для графики и обмена данными), то можно их спокойно пристегнуть к 1С-базе с помощью Вашего "посредника" ?
Если да, то это просто бальзам на душу... :)
Жаль, что +100 тут не допускается...
4. Abadonna 3968 14.06.11 08:38 Сейчас в теме
(3) Просто так пристегнуть не получится.
Функции Вашей длл обязательно должны быть полностью аналогичны по параметрам из файла-примера *.dpr
Но уж внутрь туда можно спокойно накопипастить всё из тех длл
6. vkr 14.06.11 09:51 Сейчас в теме
(4) Да у меня, насколько помню (давно было :))
больше трех входных параметров и не использовалось.
И вообще старался через адреса блоков параметров работать...
7. Abadonna 3968 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 3968 14.06.11 14:08 Сейчас в теме
(9) Первый раз про такой слышу...
11. cool.vlad4 2 14.06.11 14:19 Сейчас в теме
это ВКwrap ...прикольно...
12. Abadonna 3968 14.06.11 14:20 Сейчас в теме
Именно, чтобы уйти от мерзкого regsvr32 я и освоил в свое время ТСВК.
ЗагрузитьВнешююКомпоненту как-то поприличнее будет (в контексте 1С)
13. Ne'я 14.06.11 14:20 Сейчас в теме
а принципиальные отличия - все-таки, для чайника?
14. Abadonna 3968 14.06.11 14:32 Сейчас в теме
(13) Отличия от чего? От неизвестной мне доселе dynwrap?
Ну ладно, сходу:
Библиотека является результатом труда нескольких разработчиков.
Вчера утром в голову @@нуло, в обед было готово.
Родные интерфейсы 1С (тот же IAsyncEvent) dynwrap получит? Да никогда.
Ну и т.д. А что идеи примерно совпали - дык все идеи в воздухе витают
15. Ne'я 14.06.11 14:36 Сейчас в теме
:D Прошу считать мой неловкий вопрос желанием разобраться в отличиях ВК и СОМ.
16. Abadonna 3968 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 3968 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 3968 14.06.11 17:17 Сейчас в теме
(19)Используем вот это Запуск от имени
и никогда никаких проблем с отсутствующими правами.
Если говорить о терминалке (а по серьезному я и не вижу другого использования 1С, а если несерьезно - но можно юзверям и права дать), то там достаточно один раз админу запустить 1С с ЗагрузитьВнешнююКомпоненту и оно прорегится для всех.
20. Abadonna 3968 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 3968 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 1338 15.06.11 18:19 Сейчас в теме
вот было бы Native и возможности как у dynwrap - цены бы небыло. а так - поделка, не более.
26. Abadonna 3968 15.06.11 18:23 Сейчас в теме
(24) О каких возможностях dynwrap идет речь?
Вызывать API? Так в примере практически одни API и вызываются. Какие еще возможности нужны?
27. ValeriVP 1338 21.06.11 12:20 Сейчас в теме
(26)dynwrap обеспечивает работу с любой DLL, а не только с теми, у которых в функциях по 5 параметров
28. Abadonna 3968 21.06.11 13:05 Сейчас в теме
(27) Типа слышал звон, а не знаю, где он?
Пять параметров это в транзитной функции, которая дальше может вызывать, что угодно, и с какими угодно параметрами.
Малой кровью, и ноль трудами обошелся.
А в общем, не нравится - не ешь.
Тем более, я это просто как метод в Миракл прикрутил, а уж та общается... с чем только не общается...
29. cool.vlad4 2 21.06.11 13:13 Сейчас в теме
(27) а как вы события будете отлавливать? COM компонента (или ActiveX) и ВК от фирмы 1С это разные вещи...зачем их сравнивать
25. ValeriVP 1338 15.06.11 18:20 Сейчас в теме
не вижу широких возможностей применения
30. Душелов 4018 28.06.11 16:22 Сейчас в теме
Помнится делал я подобное, но только для .NET-овских контролов, с отловом событий.
А идея да, хороша )
31. Tahallus 441 15.08.11 10:56 Сейчас в теме
Ошибка при вызове метода контекста (Get_IAsyncEvent): Произошла исключительная ситуация (0x8000ffff)
ИнтерфейсСобытий=LL.Get_IAsyncEvent();
по причине:
Произошла исключительная ситуация (0x8000ffff)

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

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

Именно так. Не заморачивался ;)
Кстати, и не советую эту использовать, лучше скачать MiracleV8. Там этот метод прикручен, но много еще всяких вкусностей
42. jdan 9 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 4273 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
Сообщение было скрыто модератором.
...
Оставьте свое сообщение