Имя: Пароль:
1C
 
как вызвать неопределенную функцию оле из дельфи
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);

И Вызываешь метод внешней обработки ВычислитьВыражение
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан