Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

1С8 вызов функции по имени... [D7]


sniknik ©   (2011-05-12 13:05:00) 

Для начала пример
var
 Var1C8: OLEVariant;
begin
 Var1C8:= CreateOleObject('V81.Application');
 Var1C8.Connect('File="D:\DB\1C8"');
 Var1C8.Visible:= true;
 Var1C8.Message('Test');
 ...
end;

Работает, показывает, можно вместо Message поставить Сообщить с тем же результатом, или функцию описанную в глобальном модуле в определением Экспорт. Все хорошо, но нужно сделать что-то вроде скрипта задаваемого у меня текстом, с неизвестными ни у меня ни в 1С пока процедурами. (их типа будут писать после, и у меня задавить написанное в настройках, текстом)

Ну вот, и вопрос - как вызвать у COM/ActivX объекта процедуру по имени? Т.е. для примера не просто через точку объекту вот это вот "Сообщить" подписать на этапе разработки, а уже в процессе работы получая текстом имя "Сообщить" вызвать метод объекта. Ну и конечно как туда в этом случае передать параметр... в общем хочется знать каким образом компилятор это делает.


OW   (2011-05-12 16:25:00) [1]

Спасибо.


sniknik   (2011-05-12 15:31:00) [2]

> разворачивает вызовы в IDispatch
Ну, "общее" представление, что и как у меня имеется.

oxffff ©   (12.05.11 15:04) [7]
Спасибо еще раз.


oxffff   (2011-05-12 15:04:00) [3]

Набросок для удобства.

procedure CallMethodDyna(const source:olevariant;MethodName:ansistring;params:array of const);
var desc:TCallDesc;
   ParamRec:TVarRec;
   i:integer;
   ParamsBlock:array of pointer;
begin
desc.CallType:=$01;
desc.ArgCount:=length(params);
desc.NamedArgCount:=0;
setlength(ParamsBlock,length(params));
ZeroMemory(@desc.ArgTypes[0],sizeof(desc.ArgTypes));
for i := 0 to length(params)-1 do
 begin
 case params[i].VType of
 vtUnicodeString:
           begin
//Здесь поправить как надо :)
           desc.ArgTypes[i]:= varOleStr;
           ParamsBlock[i]:=params[i].VUnicodeString;
//
           end;
 end;
 end;
CopyMemory(@desc.ArgTypes[length(params)],@MethodName[1],length(MethodName));
VarDispProc(nil,source,@desc,@ParamsBlock[0]);
end;

procedure TForm4.FormCreate(Sender: TObject);
var a:oleVariant;
   value:boolean;
   disp:olevariant;
   va:variant;
   str:string;

begin
disp:=createoleObject('Word.Application');
CallMethodDyna(disp,'CheckGrammar',['111']);
end;


Вариант   (2011-05-12 14:57:00) [4]

IDIspath  Invoke??


Palladin   (2011-05-12 14:53:00) [5]


> в общем хочется знать каким образом компилятор это делает.

разворачивает вызовы в IDispatch
http://msdn.microsoft.com/en-us/library/ms221608.aspx


sniknik   (2011-05-12 14:41:00) [6]

>> Далее отладчик в руки и нужные манипуляции.
> Ну, а как иначе? :)
Кстати, нашёл похожее, поздновато только... - функция SetDispatchPropValue в comobj.


sniknik   (2011-05-12 14:36:00) [7]

oxffff ©   (12.05.11 14:16) [1]
Спасибо, сработало.

> Далее отладчик в руки и нужные манипуляции.
Ну, а как иначе? :)


oxffff   (2011-05-12 14:17:00) [8]

CDoMethod    = $01;
 CPropertyGet = $02;
 CPropertySet = $04;

Далее отладчик в руки и нужные манипуляции.


oxffff   (2011-05-12 14:16:00) [9]

Не давно был вопрос по property. Я дал в качестве ответа код, который устроил

uses comobj;

const CPropertySet = $04;

procedure SetDynaNameProperty(const source:olevariant;
                            const propertyname:ansistring;
                            const Value);
var desc:TCallDesc;
begin
desc.CallType:=CPropertySet;
desc.ArgCount:=1;
desc.NamedArgCount:=0;
ZeroMemory(@desc.ArgTypes[0],sizeof(desc.ArgTypes));
desc.ArgTypes[0]:=$B;
CopyMemory(@desc.ArgTypes[1],@propertyname[1],length(propertyname));
VarDispProc(nil,source,@desc,@value);
end;

procedure TForm4.FormCreate(Sender: TObject);
var a:oleVariant;
   value:boolean;
   disp:olevariant;
begin
disp:=createoleObject('Word.Application');
value:=TRUE;
SetDynaNameProperty(disp,'visible',value);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо