![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;