Страница 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С подключил.
Буду пробовать методы вызывать.
Так получилось или нет? есть примерчик?