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

Вниз

COM OLE Script   Найти похожие ветки 

 
vixic ©   (2003-09-23 12:46) [0]

Всем привет!!!

Пишу прогу что то на подобии Windows Script Host,
использую компонент psvActiveScript.
Проблема первая: как можно подключить свою функцию из скрипта
к обработчику события COM объекта.

Windows Script Host это делает так (JScript):

.....
function Obj_OnClick()
{
...
}

var Obj = WScript.CreateObject("LibName.ObjName");
WScript.ConnectObject(Obj,"Obj_");

...!

Проблема вторая: хочется использовать ActiveX объекты как
Internet Explorer!

Проблема третья: как в Delphi подключить динамически ActiveX
объект как например Word:

.....
uses ComObj;
.....
var V: Variant;
begin
V:=CreateOleObject("Word.Basic");
.....
V.Exit;
end;
.....!

БУДУ БЛАГОДАРЕН ЗА ЛЮБУЮ ИНФОРМАЦИЮ.

Vixic.


 
me   (2003-09-23 14:00) [1]

Проблема третья:
Требуется создать VCL-контейнер, куда ActiveX будет помещаться. Роль такого контейнера в Delphi выполняет класс TOleControl, который объявлен в модуле OleCtrls.pas. Базовый метод этого класса — InitControlData. В указанном методе необходимо определить GUID фабрики классов элемента управления ActiveX, число обработчиков событий и ссылку реализованного на клиенте интерфейса обработчиков событий, а также ссылку на лицензионный интерфейс, необходимый для вызовов методов IClassFactory2. Метод InitControlData вызывается автоматически после отработки конструктора TOleControl.
В приложение в объявим новый класс-потомок TOleControl:
type
TRTActiveX = class(TOleControl)
protected
FControlData: TControlData;
procedure InitControlData; override;
public
constructor EmbeggAX(AOwner: TComponent; AParent: TWinControl; AClassID: TGUID; Rect:TRect);
end;
Методы InitControlData и EbeggAX реализуем следующим образом:

procedure TRTActiveX.InitControlData;
begin
ControlData:=@FControlData;
end;

constructor TRTActiveX.EmbeggAX(AOwner: TComponent; AParent: TWinControl; AClassID: TGUID; Rect:TRect);
begin
with FControlData do begin
ClassID:=AClassID;
EventCount:=0;
EventDispIDs:=nil;
LicenseKey:=nil;
Flags:=$00000000;
end;
inherited Create(AOwner);
Self.parent:=AParent;
Self.visible:=true;
Self.Left:=Rect.Left;
Self.Top:=Rect.Top;
Self.Width:=Rect.Right-Rect.Left;
Self.Height:=Rect.Bottom-Rect.Top;
end;

Поместим на форму кнопку и создадим простой обработчик события:
procedure TForm1.Button1Click(Sender: TObject);
begin
TRTActiveX.EmbeggAX(Self,Self,StringToGUID("{...}"),Rect(0,0,100,100));
end;
Все!


 
nikkie ©   (2003-09-23 14:53) [2]

проблема первая:
1. получить представление о том, как подключаться к событиям COM-объекта, когда известен IID событийного интерфейса
Obj as IConnectionPointContainer.FindConnectionPoint
IConnectionPoint.Advise

2. научиться делать то же самое, когда событийный интерфейс неизвестен
Obj as IConnectionPointContainer.EnumConnectionPoints
IEnumConnectionPoints.Next(1) - здесь может было бы хорошо перебрать все connection points, но у меня Word97 при этом вешался, поэтому я брал первый попавшийся
IConnectionPoint.Advise

кроме этого тут надо реализовать IDispatch неизвестного диспинтерфейса - Invoke пока можно оставить пустым, а вот GetTypeInfo важно написать правильно. для этого нужно выцепить TypeInfo об этом интерфейсе

Obj as IDispatch.GetTypeInfo.GetContainingTypeLib.GetTypeInfoOfGuid(IConnectionPoint.GetConnectionInterface)

3. написать реализацию Invoke
ITypeInfo.GetNames - получаем имя вызываемого метода-события
добавляем к нему префикс, ищем функцию с таким названием
GetScriptDispatch.GetIDsOfNames
если нашли - переадресуем Invoke ей.


 
vixic ©   (2003-09-23 17:19) [3]

БОЛЬШОЕ СПАСИБО за ответы!

Хотелось бы поглубже изучить COM OLE и ActiveX,
посоветуйте где поискать метериал (в сети):-)


 
nikkie ©   (2003-09-23 18:04) [4]

Дейл Роджерсон, "Основы COM"
отличная книга, для реализации того, что я описал, ее достаточно.
в электронном виде есть здесь
http://www.softzenware.com/ebook.html


 
me   (2003-09-23 19:01) [5]

http://www.techvanguards.com/



Страницы: 1 вся ветка

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
1-18400
w666w
2003-09-25 17:25
2003.10.06
OnTreminate := SomeObj.SomeProc вместе с FreeOnTerminate := true;


14-18609
z1r[0]
2003-09-18 00:35
2003.10.06
Помогите начинающему :)


1-18290
Andy BitOff
2003-09-24 01:55
2003.10.06
Математика :-)


14-18533
Lancelot
2003-09-19 00:58
2003.10.06
Flame Wars


14-18543
andre
2003-09-16 22:38
2003.10.06
Ламерский вопрос