Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Вниз1С8 вызов функции по имени... Найти похожие ветки
← →
sniknik © (2011-05-12 13:05) [0]Для начала пример
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 объекта процедуру по имени? Т.е. для примера не просто через точку объекту вот это вот "Сообщить" подписать на этапе разработки, а уже в процессе работы получая текстом имя "Сообщить" вызвать метод объекта. Ну и конечно как туда в этом случае передать параметр... в общем хочется знать каким образом компилятор это делает.
← →
oxffff © (2011-05-12 14:16) [1]Не давно был вопрос по 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;
← →
oxffff © (2011-05-12 14:17) [2]CDoMethod = $01;
CPropertyGet = $02;
CPropertySet = $04;
Далее отладчик в руки и нужные манипуляции.
← →
sniknik © (2011-05-12 14:36) [3]oxffff © (12.05.11 14:16) [1]
Спасибо, сработало.
> Далее отладчик в руки и нужные манипуляции.
Ну, а как иначе? :)
← →
sniknik © (2011-05-12 14:41) [4]>> Далее отладчик в руки и нужные манипуляции.
> Ну, а как иначе? :)
Кстати, нашёл похожее, поздновато только... - функция SetDispatchPropValue в comobj.
← →
Palladin © (2011-05-12 14:53) [5]
> в общем хочется знать каким образом компилятор это делает.
разворачивает вызовы в IDispatch
http://msdn.microsoft.com/en-us/library/ms221608.aspx
← →
Вариант (2011-05-12 14:57) [6]IDIspath Invoke??
← →
oxffff © (2011-05-12 15:04) [7]Набросок для удобства.
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;
← →
sniknik © (2011-05-12 15:31) [8]> разворачивает вызовы в IDispatch
Ну, "общее" представление, что и как у меня имеется.
oxffff © (12.05.11 15:04) [7]
Спасибо еще раз.
← →
OW © (2011-05-12 16:25) [9]Спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.073 c