Текущий архив: 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.46 MB
Время: 0.012 c