Страница 1 из 1

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

Добавлено: 04 Декабрь 2007, 17:36
ru_alex
Всем привет!

Можно ли на Clarion реализовать сабж?
Интерес пока носит теоретический характер. Например, создать dll, в которой будет реализация COM или ActiveX объекта, который затем можно вставить в приложение на Клаше или не на Клаше.
Есть ли у кого наработки/примеры и возможность ими поделиться?

Добавлено: 04 Декабрь 2007, 22:30
ingasoftplus
Канечно. У нас есть продукт EasyCOMCreator

Добавлено: 05 Декабрь 2007, 9:17
Игорь Столяров

Добавлено: 05 Декабрь 2007, 17:01
ru_alex
Всем спасибо!

Посмотрю, почитаю :)

Добавлено: 10 Декабрь 2007, 13:10
ru_alex
Всем привет!

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

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

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

Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует интерфейс IInitDone) 

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

Добавлено: 11 Декабрь 2007, 11:36
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;
} 

Добавлено: 11 Декабрь 2007, 12:22
Дед Пахом
Что-нибудь вроде этого

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

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

Добавлено: 11 Декабрь 2007, 12:43
ru_alex
Спасибо огромное!
Мало опыта по переводу сишного кода. Полдня уже туплю, ничего не получается.
Все заработало, dll к 1С подключил.
Буду пробовать методы вызывать.

Добавлено: 11 Декабрь 2007, 14:59
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)

Добавлено: 11 Декабрь 2007, 16:40
Дед Пахом
Попробуй

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

RegisterExtensionAs  PROCEDURE(*BSTRING pExtensionName)
  CODE
  pExtensionName = "AddInExtension"
  RETURN S_OK

Добавлено: 11 Декабрь 2007, 18:35
ru_alex
Пробовал, не работает. Мне кажется нужно что-то типа:

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

 program

  map
    test1(*long qq_)
  end

qq   &long

  code
  test1(qq)

test1    procedure(*long qq_)
  code
  qq_ &= new(long)
естественно не компилится

Добавлено: 11 Декабрь 2007, 21:04
Дед Пахом
А так работает?

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

    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'

Re:

Добавлено: 01 Ноябрь 2010, 15:49
morkovin
ru_alex писал(а): Все заработало, dll к 1С подключил.
Буду пробовать методы вызывать.
Так получилось или нет? есть примерчик?