Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.071 c
15-1339959786
Artem
2012-06-17 23:03
2013.03.22
Pocket Fritz


15-1351848847
картман
2012-11-02 13:34
2013.03.22
морфология кахзахского языка


6-1266221364
Pavel
2010-02-15 11:09
2013.03.22
Время обработки запроса


15-1340000253
palva
2012-06-18 10:17
2013.03.22
Рожденным в СССР


2-1340868561
начинающий41
2012-06-28 11:29
2013.03.22
формат даты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский