Главная страница
    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.47 MB
Время: 0.064 c
2-1337284179
Vasia
2012-05-17 23:49
2013.03.22
Как прописать путь к файлу что бы он отображался...


2-1332437524
sasha198407
2012-03-22 21:32
2013.03.22
ошибка Exception EAccessViolation in module Project1.exe


4-1259213007
Alex_C
2009-11-26 08:23
2013.03.22
Работа с LPT-портом


2-1331584288
advise
2012-03-13 00:31
2013.03.22
Посоветуйте плз как разбить AVI файл на кадры?


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