COM/ActiveX объекты на Clarion?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

COM/ActiveX объекты на Clarion?

Сообщение ru_alex »

Всем привет!

Можно ли на Clarion реализовать сабж?
Интерес пока носит теоретический характер. Например, создать dll, в которой будет реализация COM или ActiveX объекта, который затем можно вставить в приложение на Клаше или не на Клаше.
Есть ли у кого наработки/примеры и возможность ими поделиться?
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 464
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 124 раза
Поблагодарили: 6 раз

Сообщение ingasoftplus »

Канечно. У нас есть продукт EasyCOMCreator
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8035
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Сообщение Игорь Столяров »

Make Clarion Great Again ! 😎
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Всем спасибо!

Посмотрю, почитаю :)
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Всем привет!

Попробовал я собрать пример на основании статьи, предложеной выше. Он конечно же работает. Решил подключить тестовый пример к 1С (одна из возможных сфер применения). Не получилось, да сообственно и не должно было, у них есть особые требования к подключению внешних компонент.
Первое требование: наличие интерфейса IInitDone, наследованного от IUnknown и три метода в нем Init, Done, GetInfo.
Попытался реализовать, 1С его не видит.
Попробовал реализовать этот пример на EasyCOMCreator. Триал версия вроде как позволяет собрать такой простенький пример.
Пример получился побольше размером, оказалось что он еще и tlb файл генерит и в реестр побольше инфы об объекте пишет.
Но в 1С все равно не подключается :(
Уже не знаю куда копать, может кто подскажет?

1С77, Clarion6_9057
Ошибка:

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

Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует интерфейс IInitDone) 
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Немного продвинулся. :)
Нашел еще одно требование: GUID интерфейса IInitDone должен быть {AB634001-F13D-11D0-A459-004095E1DAEA}
Правда немного продвинулся, но это похоже связано с другими требованиями, которые я еще не выполнил.
Если у кого есть опыт работы с 1С через COM, или опыт написания ВК для 1С, просьба помочь...
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Кто-нибудь знает как реализовать эту функцию на Clarion?

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

STDMETHODIMP CAddIn::GetInfo(SAFEARRAY **pInfo)
{
      // Component should put supported component technology version 
      // in VARIANT at index 0     
    long lInd = 0;
    VARIANT varVersion;
    V_VT(&varVersion) = VT_I4;
      // This component supports 1.0 version
    V_I4(&varVersion) = 1000;
    SafeArrayPutElement(*pInfo,&lInd,&varVersion);
    
	return S_OK;
} 
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сообщение Дед Пахом »

Что-нибудь вроде этого

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

GetInfo  PROCEDURE(LONG pInfo)
varVersion      VARIANT
gvarVersion    LIKE(gVariant),OVER(varVersion)
lInd                LONG
  CODE
  varVersion = 1000
  SafeArrayPutElement(pInfo,ADDRESS(lInd),ADDRESS(gvarVersion))
  RETURN S_OK
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Спасибо огромное!
Мало опыта по переводу сишного кода. Полдня уже туплю, ничего не получается.
Все заработало, dll к 1С подключил.
Буду пробовать методы вызывать.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

А с этой функцией как быть?

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

STDMETHODIMP CAddIn::RegisterExtensionAs(BSTR *pExtensionName)
{
      // Name of extension should be changed avoiding conflicts 
    CString csExtenderName = "AddInExtension";
    *pExtensionName = csExtenderName.AllocSysString();

	return S_OK;
}  
Описание:
В переменную pExtensionName помещается наименование расширения. Память для строки выделяется объектом компоненты стандартными системными функциями для работы с OLE-строками (например, SysAllocString. 1C:Предприятие освобождает эту память вызовом SysFreeString)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сообщение Дед Пахом »

Попробуй

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

RegisterExtensionAs  PROCEDURE(*BSTRING pExtensionName)
  CODE
  pExtensionName = "AddInExtension"
  RETURN S_OK
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Пробовал, не работает. Мне кажется нужно что-то типа:

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

 program

  map
    test1(*long qq_)
  end

qq   &long

  code
  test1(qq)

test1    procedure(*long qq_)
  code
  qq_ &= new(long)
естественно не компилится
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сообщение Дед Пахом »

А так работает?

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

    program
    map
        RegisterExtensionAs(*BSTRING pExtensionName)
    end

bstrExtensionName   bstring
ExtensionName       string(256)

    code
    RegisterExtensionAs(bstrExtensionName)
    ExtensionName = bstrExtensionName
    message(ExtensionName)

RegisterExtensionAs  PROCEDURE(*BSTRING pExtensionName) 
  CODE 
  pExtensionName = 'AddInExtension'
С уважением, ДП
Аватара пользователя
morkovin
Ветеран
Сообщения: 935
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 4 раза
Контактная информация:

Re:

Сообщение morkovin »

ru_alex писал(а): Все заработало, dll к 1С подключил.
Буду пробовать методы вызывать.
Так получилось или нет? есть примерчик?
WBR, morkovin
Ответить