Главная страница
    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.054 c
2-1340011274
начинающий_
2012-06-18 13:21
2013.03.22
битовые операции


15-1341492118
Unknown user
2012-07-05 16:41
2013.03.22
Определить или открыто главное меню


15-1335039032
Andryk
2012-04-22 00:10
2013.03.22
Всем привет, тутже есть математики?)))


2-1342464470
vlk32
2012-07-16 22:47
2013.03.22
Проверка корректности ссылки на объект


15-1338220756
brother
2012-05-28 19:59
2013.03.22
Как Вы прочитали это: CoCu ?





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