Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1348475426
AV
2012-09-24 12:30
2013.03.22
Оптимизировать/придумать алгоритм. Просто так.


1-1295204106
IPranker
2011-01-16 21:55
2013.03.22
Является ли многоугольник выпуклым?


2-1334912268
ChainikDenis
2012-04-20 12:57
2013.03.22
Изменение размера TreeView


15-1341336305
alexdn
2012-07-03 21:25
2013.03.22
Фон для штмл странички


15-1340569805
Юрий
2012-06-25 00:30
2013.03.22
С днем рождения ! 25 июня 2012 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский