Имя: Пароль:
1C
 
Загрузка ВК без регистрации в реестре
0 orefkov
 
30.05.06
14:23
Удалось создать ВК, которая умеет сама загружаться без регистрации ее в реестре, и загружать остальные ВК. Облегчи жизнь админу!
http://openconf.itland.ru/vk/vkloader
1 Кабан мимо пробеган
 
30.05.06
14:27
Спасибо.. Дождались-таки...
2 MMF
 
30.05.06
14:30
(0) а можно в двух словах о том как это работает?
3 The gray Cardinal
 
30.05.06
14:30
(0) Браво!
Теперь глупый вопрос :)
Возможна ли реализация такого механизма для любых COM-серверов в любых средах, которые могут выступить в роли OLE-клиента?
4 GrayT
 
30.05.06
14:34
(2)По ссылке есть немного.
(0)Сенкс.
ЗЫ: Эх опять чувствую себя бараном.....
5 smaharbA
 
30.05.06
14:34
(0) маладца
А вот для ком wsc есть такая беда очч удобно GetObject("script:c:\com.wsc") к примеру, и можно даже так GetObject("script:c:\com.wsc#componenta") и тоже ничего регить ненада, у тебя чтото похожее вышло...
6 MMF
 
30.05.06
14:36
(4) ткни носом
7 orefkov
 
30.05.06
14:36
(2)
Вобщем правится таблица импорта seven.dll - CLSIDFromProgID и CoCreateInstance
и таблица импорта frame.dll - CoCreateInstance.

Для работы CLSIDFromProgID в компоненту передают пары ProgID - CLSID,
и она ищет сначала в них, и только потом штатно в реестре.
А в CoCreateInstance если попадает CLSID ВК, создается ее объект через
DllGetClassObject в dll ВК.
8 АЛьФ
 
модератор
30.05.06
14:37
2(7) Получается свой маленький реестр :)
9 GrayT
 
30.05.06
14:37
(6)Принцип работы основан на перехвате обращения 1С к WinAPI функциям CLSIDFromProgID и CoCreateInstance.
Хотя возможно я ткнул пальцем в..... и тебя волновало
"Благодаря некоторым хитростям, ВК загружается без всякой ее регистации в реестре,"
10 MMF
 
30.05.06
14:39
(9) точно, я тоже так хочу, только масла в голове не хватает
11 orefkov
 
30.05.06
14:40
(9)
Там тоже никаких особых хитростей.
Когда 1С подгружает дллку, чтобы считать строковый ресурс № 100,
в дллке выполняется DllMain, то есть мой код. Остальное дело техники, см (7)
12 MMF
 
30.05.06
14:42
(10+) или (7) происходит сразу в точке входа dll?
13 MMF
 
30.05.06
14:42
(11) спасибо
14 jbond
 
30.05.06
14:43
Это уже реализовано в 1С++?
15 orefkov
 
30.05.06
14:47
(14) Зачем?
16 vladnet
 
31.05.06
07:33
Ура! Наконец то это стало возможным :)
(0) Спасибо
17 smaharbA
 
31.05.06
07:41
А теперь вопрос - и небудет пресловутого "CLSID не найден" даже если ВК "неверно организована"...?
18 vladnet
 
31.05.06
08:12
Compaund.dll

Ошибка 5
Не удалось получить идентификатор ВК

:(
19 vladnet
 
31.05.06
08:16
А может ее тоже не надо регистрировать, у меня возможности проверить нет, компьютер один
20 Лефмихалыч
 
31.05.06
08:25
(18) может дело в орфографии?
21 vladnet
 
31.05.06
08:29
(20) Да вроде нет, проверил снова. Хотя подозрения возникают :)
COMPOUND.DLL
22 vladnet
 
31.05.06
08:34
Такой код:

//------------------------------------------------------------------------------
Функция глЗагрузитьВнешнююКомпоненту(пИмяФайлаКомпоненты, пПараметрЗагрузки="")    глЗагрузчикВК=СоздатьОбъект("ЗагрузчикВК");
   глЗагрузчикВК.ЗагрузитьВК(пИмяФайлаКомпоненты, пПараметрЗагрузки);
   Возврат 1;
КонецФункции

   глЗагрузитьВнешнююКомпоненту("SCANOPOS.DLL", "Addin.Scanner=145344b1-3fc5-11d1-a470-004095e1daea");
   глЗагрузитьВнешнююКомпоненту("VTools.dll", "Addin.VTools=04024c33-1111-11d1-a486-004095e1daea");

Не работает, говорит что
{Глобальный модуль(626)}: Поле агрегатного объекта не обнаружено (ЗагрузитьВК)
После второго запуска данной процедуры. :(
Что делаю не так? Или сразу несколько загружать нельзя?
23 vladnet
 
31.05.06
08:43
Попробывал и так и сяк.
Объект ЗагрузчикВК, можно использовать только один раз на моей системе, после этого он как то падает и на все остальные команды, говорит что поле агрегатного объекта не обнаружено. Причем создание объекта заново не помогает.
PS WinXP SP2, 1c 25 SQL
24 Лефмихалыч
 
31.05.06
09:07
Процедура ПриНачалеРаботыСистемы()
  глЗагрузчик = СоздатьОбъект("ЗарузчикВК");
КонецПроцедуры
Функция глЗагрузитьВнешнююКомпоненту(пИмяФайлаКомпоненты, пПараметрЗагрузки="")      глЗагрузчикВК.ЗагрузитьВК(пИмяФайлаКомпоненты, пПараметрЗагрузки);
   Возврат 1;
КонецФункции

   глЗагрузитьВнешнююКомпоненту("SCANOPOS.DLL", "Addin.Scanner=145344b1-3fc5-11d1-a470-004095e1daea");
   глЗагрузитьВнешнююКомпоненту("VTools.dll", "Addin.VTools=04024c33-1111-11d1-a486-004095e1daea");
25 orefkov
 
31.05.06
09:48
Обновил версию до 1.0.0.2

Теперь попутно решает проблему "зависания" процесса 1С в памяти при закрытии программы при использовании несовсем корректно написанных сторонних внешних компонент.

(18) compaund.dll разве ВК ?
(22) Буду проверять.
26 orefkov
 
31.05.06
10:19
(22) Проверил. У меня все нормально. Правда, у меня нет vtools.dll, проверял без нее. Спишись со мной. Адрес в readme.chm
27 Вильям
 
31.05.06
11:05
(0) Респект и уважуха. В который раз уже...
28 vladnet
 
31.05.06
16:53
(25) Тестовую конфигурацию выслал. Видимо у меня достаточно не типичный способ загрузки.
С компаундом действительно ошибся :( Извиняйте.
29 romix
 
модератор
31.05.06
17:36
(0) Ух блин респектище! Хочу переписать этот принцип на дельфи в виде дополнения к своему патчу - тогда не придется править типовые... Разрешаете?
30 промоутер Орефкова
 
31.05.06
17:39
да ладно, чего уж там, разрешаем.
31 orefkov
 
01.06.06
08:58
(29)
Идеи - дарю.
32 vladnet
 
01.06.06
10:45
(31) Александр, а как по моей тестовой ошибке?
Там ошибка возникает в силу каких то недоразумений с 1с++, а именно выявлена ошибка при работе с ДобавитьГлобальныйМодуль.
33 gr13
 
01.06.06
10:54
класс! счас попробую, у меня как раз одна компонента не загружается внешняя
34 orefkov
 
01.06.06
11:12
На http://openconf.itland.ru/vk/vkloader выложены исходники (MS VC++ 6.0).

(32) Извини, пока не смотрел. По идее не должно быть конфликтов.
35 vladnet
 
01.06.06
12:50
(34) Понимаю, работы много и без этого. Чтож пока отложу переход на этот механизм загрузки.
36 kink
 
02.06.06
13:44
Отличная штука, особенно актуально в терминале
AdBlock убивает бесплатный контент. 1Сергей