v7: 1С 7.7, COM-объекты и out-параметры #754188


#0 by бомболюк
Добрый день. Написал на дельфях COM объект, который планирую использовать в 1С 7.7. Проблема в том, что не получается изменив значение параметра метода в теле COM объекта вернуть его в 1С. Вот описание метода, проблема с параметром OutData: function DoSomeMethod(const InData: WideString; var OutData: WideString): Integer; safecall; Подскажите, куда копнуть, все уже перепробовал, но кроме как в результате метода вернуть ничего не получается.
#1 by Serginio1
Вообще то все параметры в 1с передаются по ссылке. Если что, можешь через ВК Исходник ВК, которая загружает Объект Автоматизации, поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender Поддержка Var и Out параметров
#2 by бомболюк
Что то переделывать все из-за этого совсем не хочется.
#3 by H A D G E H O G s
Специально для вас создали конструктор интерфейсов и их свойств и методов в Delphi.
#4 by H A D G E H O G s
Пробуй так: function DoSomeMethod(const InData: WideString; var OutData: OleVariant): Integer; safecall;
#5 by Serginio1
А там переделывать ничего не надо. Загрузить объект в ВК можно двумя способами     ЗагрузитьВнешнююКомпоненту("AddInFromITypeInfo.dll");        д=CreateObject("AddinTypeInfo.AddinTypeInfo");        Загрузить объект в ВК можно двумя способами Где     AddInFromITypeInfo.dll это данная ВК;   AddinTypeInfo.AddinTypeInfo пример Automation Object находящийся в VKITypeInfoAddinTypeInfo .LoadOleObject(д); Где     AddInFromITypeInfo.dll это данная ВК;   AddinTypeInfo.AddinTypeInfo пример Automation Object находящийся в VKITypeInfoAddinTypeInfo То есть подгрузив в ВК ты вызываешь все методы и свойства твоего оле объекта. Это просто прокси. Например OutData сможешь изменить в своем оле объекте
#6 by Serginio1
Внутри проверяется параметр по ссылке или по значению   if FuncDesc.lprgelemdescParam[j].tdesc.vt =VT_PTR   Then //Данный параметр передается по ссылке     MethodArray[i].Params[j]:=FuncDesc.lprgelemdescParam[j].tdesc.ptdesc.vt
#7 by Serginio1
Внутри ВК вызов метода твоего объекта function TAddInObject.CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray{(OleVariant)}): HResult; stdcall; Inf:ExcepInfo; begin              if FillParams(MethodArray[lMethodNum],Args,paParams,DispParams)<>S_OK Then       result:=obj.Invoke(MethodArray[lMethodNum].DispId, GUID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD OR DISPATCH_PROPERTYGET, DispParams, @VarResult, , nil);       If Result<>S_OK Then              Begin                If TVarData(VarResult).VType = varByRef or varVariant Then
#8 by Serginio1
Вот методо заполнения параметров Function FillParams(Var MethodRecord:TMethodRecord;Var Args:TArgs; var paParams: PSafeArray{(OleVariant)}; var DispParams: TDispParams): HResult; Var P:PParamsArray; i,j:Integer; begin              if Length(MethodRecord.Params)=0 Then   For i:=0 to j Do       Begin    If MethodRecord.Params[i].IsPtr Then //=========================================================       If MethodRecord.Params[i].ParamType=VT_VARIANT Then       begin      Args[j-i].vt:=VT_BYREF  or VT_VARIANT;         begin         if MethodRecord.Params[i].ParamType<>TvarData(p^[i]).VType Then      begin       If MethodRecord.Params[i].ParamType=VT_VARIANT Then         begin         if MethodRecord.Params[i].ParamType<>TvarData(p^[i]).VType Then
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С