![]() |
|
как вызвать неопределенную функцию оле из дельфи | ☑ | ||
---|---|---|---|---|
0
Kabz
16.09.15
✎
01:51
|
V8 := CreateOleObject('V82.COMConnector');
MainObject := V8.Connect(starttext); ctr := MainObject.Obta(); так работает а как вызвать процедуру если она указана в переменной proc:='Obta'; V8 := CreateOleObject('V82.COMConnector'); MainObject := V8.Connect(starttext); ctr := MainObject[proc]() так ошибка |
|||
1
Chieftain
16.09.15
✎
03:16
|
(0) В моем шаблоне ВК это выглядело примерно так:
if IDispatch(obj).GetIDsOfNames(GUID_NULL,@MethodName,1,LOCALE_USER_DEFAULT,@MethodID)=S_OK then If IDispatch(obj).Invoke(MethodID,GUID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,DispParams,@VarResult,@ExcepInfo,nil)=S_OK Then |
|||
2
Kabz
20.09.15
✎
00:50
|
Пол дня мучаюсь в core.dll идет ошибка может кто поможет ..
procedure TForm1.Button1Click(Sender: TObject); var V8: OLEVariant; MainObject: Variant; sMethodName :WideString; d:System.IDispatch; res:Integer; ctr: string; starttext: string; MethodID: Integer; DispParams : array of OleVariant; ExcepInfo : Pointer ; err : Pointer ; begin starttext:='File="E:\1с_v8.2\нн";Usr="Администратор";Pwd=""'; V8 := CreateOleObject('V82.COMConnector'); sMethodName := 'Obtained' ; MainObject:=V8.Connect(starttext); res:=IDispatch(MainObject).GetIDsOfNames(GUID_NULL, @sMethodName, 1, LOCALE_SYSTEM_DEFAULT,@MethodID); SetLength(DispParams, 4) ; DispParams[0] := 'Ini'; DispParams[1] := 'Start1'; DispParams[2] := ''; DispParams[3] := ''; if res=S_OK then IDispatch(MainObject).Invoke(MethodID,GUID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,DispParams,@ctr,@ExcepInfo,nil) ; ShowMessage(ctr); end; end. |
|||
3
Kabz
20.09.15
✎
00:50
|
вот он ее отформатировал.
|
|||
4
Serginio1
20.09.15
✎
01:13
|
Посмотри http://catalog.mista.ru/public/345658/
там есть Исходник ВК, которая загружает Объект Автоматизации, поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender. И есть вызовы через Idispatch. А вообще проще использовать внешние обработки. |
|||
5
Kabz
20.09.15
✎
01:23
|
(4) причем здесь обработки когда внешние данные приходят...
|
|||
6
Chieftain
20.09.15
✎
01:23
|
procedure TForm1.Button1Click(Sender: TObject);
var MethodID : Integer; MethodName : WideString; ExcepInfo : TExcepInfo; obj : Variant; DispParams : TDispParams; V8:OleVariant; VarResult:OleVariant; begin DispParams.cArgs := 0; GetMem(DispParams.rgvarg,0*SizeOf(TVariantArg)); V8 := CreateOleObject('V81.COMConnector'); obj:=V8.Connect('File="..."; Usr="..."; Pwd=""'); MethodName := 'Тест'; if IDispatch(obj).GetIDsOfNames(GUID_NULL,@MethodName,1,LOCALE_USER_DEFAULT,@MethodID)=S_OK then If IDispatch(obj).Invoke(MethodID,GUID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,DispParams,@VarResult,@ExcepInfo,nil)=S_OK Then ShowMessage('ok'); obj := Unassigned; ShowMessage(VarResult); end; |
|||
7
Chieftain
20.09.15
✎
01:26
|
"Тест" - функция модуля внешнего соединения
|
|||
8
Chieftain
20.09.15
✎
02:25
|
http://catalog.mista.ru/public/15527/
там мой шаблончик лежит, но как оказалось - стал черновиком |
|||
9
Chieftain
20.09.15
✎
02:25
|
А вот 100% работающий код - выдержка из (8)
Type TParams = class(TObject) FCount : Integer; DispParams : TDispParams; constructor Create(NumParams:Integer); destructor Destroy; Override; function GetParam(Index: Integer): OleVariant; procedure SetParam(Index: Integer; Const Value: OleVariant); property Params[Index: Integer]: OleVariant read GetParam write SetParam; default; end; constructor TParams.Create(NumParams: Integer); begin DispParams.cArgs := NumParams; GetMem(DispParams.rgvarg,NumParams*SizeOf(TVariantArg)); end; destructor TParams.Destroy; Begin FreeMem(DispParams.rgvarg); End; function TParams.GetParam(Index: Integer): OleVariant; begin if (Index<1)or(Index>DispParams.cArgs) then Exit; Result := OleVariant(DispParams.rgvarg[DispParams.cArgs-Index]); end; procedure TParams.SetParam(Index: Integer; Const Value: OleVariant); begin if (Index<1)or(Index>DispParams.cArgs) then Exit; DispParams.rgvarg[DispParams.cArgs-Index]:=TVariantArg(Value); end; //***************************************************************** // ????? ??????? ????????? function CallFunction (Name:String;Context:OleVariant;Params:TParams;Var VarResult:OleVariant):Boolean; var MethodID : Integer; MethodName : WideString; ExcepInfo : TExcepInfo; obj : Variant; begin Result := False; obj := Context; if (VarType(obj) And VarTypeMask)<>varDispatch then Exit; MethodName := Name; if IDispatch(obj).GetIDsOfNames(GUID_NULL,@MethodName,1,LOCALE_USER_DEFAULT,@MethodID)=S_OK then If IDispatch(obj).Invoke(MethodID,GUID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,Params.DispParams,@VarResult,@ExcepInfo,nil)=S_OK Then Result := True; obj := Unassigned; end; //***************************************************************** // ????? ????????? ????????? function CallProcedure(Name: String; Context: OleVariant; Params: TParams): Boolean; Var VarResult:OleVariant; begin Result:=CallFunction(Name,Context,Params,VarResult); end; //***************************************************************** procedure TForm1.Button1Click(Sender: TObject); var V8 : OleVariant; V8_obj : OleVariant; Params : TParams; VarResult : OleVariant; begin Params := TParams.Create(4); Params[1] := 'Ini'; Params[2] := 'Start1'; Params[3] := ''; Params[4] := ''; V8 := CreateOleObject('V81.COMConnector'); V8_obj := V8.Connect('File="c:\BASES\???????\"; Usr="?????????"; Pwd=""'); if CallFunction('Obtained',V8_obj,Params,VarResult) Then ShowMessage(VarResult); V8_obj := Unassigned; V8 := Unassigned; end; |
|||
10
Serginio1
20.09.15
✎
08:54
|
(5) Ты можешь передать в обработку данные, а внутри неё уже сделать сделать весь код обработки данных. При этом сначала оттестировав в среде 1С.
|
|||
11
Serginio1
20.09.15
✎
08:56
|
||||
12
Serginio1
20.09.15
✎
09:07
|
В 1С есть методы Вычислить и Выполнить.
Кроме того все параметры по умолчанию в 1С передаются по ссылке |
|||
13
Serginio1
20.09.15
✎
09:09
|
И парметры передаются в обратном порядке
|
|||
14
Serginio1
20.09.15
✎
09:28
|
||||
15
Serginio1
20.09.15
✎
10:31
|
Например делаешь функциб
Функция ВычислитьВыражение(Метод,МассивПараметров) Экспорт Параметры=""; Для сч=0 по МассивПараметров.ВГраница() Цикл Параметры=Параметры+",МассивПараметров["+сч+"]"; КонецЦикла; Параметры=Сред(Параметры,2); возврат Вычислить(Метод+"("+Параметры+")"); КОнецФункции Например тебе нужно вычислить функцию Функция ТесттВычислить(Парам1,парам2) Сообщить("Вычисляется ТесттВычислить"); Возврат Парам1+парам2 КонецФункции Вызываешь так МассивПараметров=Новый Массив; МассивПараметров.Добавить(5); МассивПараметров.Добавить(6); Сообщить(ВычислитьВыражение("ТесттВычислить",МассивПараметров)); На Delphi где то так МассивПараметров=MainObject.NewObject("Массив"; МассивПараметров.Добавить(5); МассивПараметров.Добавить(6); И Вызываешь метод внешней обработки ВычислитьВыражение |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |