Внешняя компонента для 1С на VB...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Внешняя компонента для 1С на VB...

Сообщение iGrok » 01.04.2008 (Вт) 14:57

Понадобилось сделать.

Что это такое.
Это dll. Внутри класс, реализующий интерфейсы IInitDone и ILanguageExtender.

В принципе, как и чего разобраться вполне можно, благо я нашел соотвествующую tlb.

Но работать оно не хочет. Точнее, 1С ругается на невозможность создания объекта Addin.ARunApp

Притом из VB такая штука создается и работает.
Примеров создания ВК в сети масса. Но в основном это C# или Дельфи. На ВБ не нашел ничего. Да и с интерфейсами раньше работать не приходилось.

Может кто-нить чем-нить помочь?

Ах, да. Нашел еще вот такую штуку:
http://soaron.fromru.com/vkhints.htm
Код: Выделить всё
1.1 Классификация
1.1.1. ВК - Внешняя компонента.
1.1.2. COM-объект - двоичный код выполняющий какую-либо функцию.
1.1.3. COM-Интерфейс - описание методов и свойств необходимых для правильного обращения клиента к COM-объекту, а объекту правильно ответить клиенту.
1.1.4. COM-класс(со-класс) - объединение интерфейсов. Нельзя обратиться к COM - интерфейсу непосредственно, а только через со-класс.
1.1.5. Библиотека типов - это файл содержащий список свойств, методов, интерфейсов и т.д. COM-объекта.
1.1.6. GUID(Globally Unique IDentifier) идентификатор интерфейсов или класса обеспечивающий его уникальность перед другими интерфейсами.
1.1.7. CLSID - GUID класса.
1.1.8. Счетчик ссылок - число процессов, которые в данным момент используют COM - объект.
1.1.9. ProcID - Идентификатор COM-Сервера
1.1.10. In-process server - библиотека COM-объект, которая запускается в одном адресном пространстве с программой-клиентом.

1.2 Опыт
1.2.1. АРХИВАЖНО!!! GUID's всех стандартных интерфейсов которые экспортируются компонентой должны равнятся GUID's указанных в примерах.
IInitDone={AB634001-F13D-11D0-A459-004095E1DAEA}
IPropertyBag={55272A00-42CB-11CE-8135-00AA004BB851}
IPropertyProfile={AB634002-F13D-11D0-A459-004095E1DAEA}
IAsyncEvent={AB634004-F13D-11D0-A459-004095E1DAEA}
ILanguageExtender={AB634003-F13D-11D0-A459-004095E1DAEA}
IStatusLine={AB634005-F13D-11D0-A459-004095E1DAEA}
IExtWndsSupport={EFE19EA0-09E4-11D2-A601-008048DA00DE}
1.2.2. Методы Init и Done интерфейса IInitDone вызываются 1с n+1 раз, где n - количество объектов экспортируемых компонентой. Надо внимательно в этих методах работать с динамической памятью.
1.2.3. Метод IsPropReadable интерфейса ILanguageExtender не вызывается в текущих версиях платформы 1с. Отсюда все свойства доступны для чтения, с момента подключения компоненты.
1.2.4. Для использования интерфейса AppDispatсh необходимо у него вызвать метод AddRef, который увеличивает счетчик ссылок на объект интерфейса. В противном случае происходит зависание 1с при закрытии программы. В Delphi для предотвращения зависания 1С необходимо включить следующий код (в качестве примера):
// В собственном методе пишем и все работает !!!!!
// никаких дополнительных строк кода больше не надо
var
obj : IDispatch;
obj0 : Variant;

begin
obj := OleVariant(pConn).AppDispatch;
obj._AddRef;
obj0 := Variant(obj).CreateObject('Справочник.Сотрудники');
obj0.ВыбратьЭлементы;
... и так далее
1.2.5. АРХИВАЖНО!!! Подключение компоненты можно выполнить двумя способами, через
ЗагрузитьВнешнююКомпоненту("<имя файла внешней компоненты с расширением, но без пути>"); Тогда ProgID задающийся в компоненте = "AddIn.<имя файла внешней компоненты без расширения>" или ProgID="AddIn.<Ni>", где Ni есть строка вида "<Имя1>[|<Имя2>][|<Имя3>]...[|<Имяi>]". Эта строка задается в файле ресурсов (*.RC) под идентификатором 100. 1с сама зарегистрирует компоненту как COM сервер. Также можно перед подключением самому сначала зарегистрировать ее (regsvr32 <Имя вашей dll>), а подключать при помощи ПодключитьВнешнююКомпоненту("<ProgID>"), где <ProgID> может иметь вид "<ProgID1>[|<ProgID2>]...[|<ProgIDn>]". Во втором случае необязательно нахождение компоненты в папке с БД, точнее она может располагаться где угодно, в пределах локального компьютера поскольку любая компонента по классификации является In-process server'ом.
1.2.6. Для того чтобы передать в метод 1С параметр по умолчанию из ВК, необходимо этот параметр приравнять значению константы varUnknown
($D,0xD), а не VT_EMPTY ($0,0x0).


Честно говоря не представляю себе, как проверить соответствие GUIDов..
Вложения
ARunApp.zip
Внутри проект и tlb..
(22.74 Кб) Скачиваний: 182
label:
cli
jmp label

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 01.04.2008 (Вт) 15:44

GUIDы проверять не нужно, они из tlb берутся.
Проект должен именоваться AddIn.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 01.04.2008 (Вт) 15:51

И так пробовал.. ((
Проект AddIn
Класс MyRunApp
В ресурсах строка 100 = MyRunApp

Подключаю, создаю объект "AddIn.MyRunApp"
Матерится, что объект не найдет.

1С 8 и 8.1


Код: Выделить всё
{Форма.Форма(5)}: Тип не определен (AddIn.MyRunApp)
    ЗапускПриложения = Новый("AddIn.MyRunApp");//подключаем COM-объект


Проект ессесно переименован в AddIn.
label:
cli
jmp label

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 02.04.2008 (Ср) 0:02

Код: Выделить всё

Sub ILanguageExtender_RegisterExtensionAs(bstrExtensionName As String)
    bstrExtensionName = "MyRunApp" 'без Addin
End Sub

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 02.04.2008 (Ср) 10:31

Шпасиба!!! Оно заработало.

Во всех примерах, которые видел, почему-то было "AddIn..."
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 84

    TopList