目前在做一个项目,开发一个控件供给web使用,第一次开发Delphi ActiveX,记录开发过程。
1、新建一个ActiveX Library工程。2、接着新建一个Type Library。
3、现在新建Automation Object,选中Generate Event support code(作为web事件调度)。
4、保存工程,记住Type Library不能和class同名,否则类的classid出现Class_xxxx_,多了一个_。
5、在tlb观察器中可以看到interface的parent interface是IDispatch,同时还有一个interfaceEvents事件接口。
6、再增加一个接口interface2和一个类coclass2。
7、系统会自动帮你将第一个类声明和实现完成,手动加的接口和类必须自己实现。
- TClass1 = class(TAutoObject, IConnectionPointContainer, IObjectSafety,interface1)
- private
- { Private declarations }
- FConnectionPoints: TConnectionPoints;
- FConnectionPoint: TConnectionPoint;
- FEvents: IDeviceControlEvents;
- { note: FEvents maintains a *single* event sink. For access to more
- than one event sink, use FConnectionPoint.SinkList, and iterate
- through the list of sinks. }
- function GetInterfaceSafetyOptions(const IID: TIID; pdwSupportedOptions,
- pdwEnabledOptions: PDWORD): HResult; stdcall;
- function SetInterfaceSafetyOptions(const IID: TIID; dwOptionSetMask,
- dwEnabledOptions: DWORD): HResult; stdcall;
- FHandler: OleVariant;
- ...
- public
- procedure notify(status: Integer);
- public
- constructor Create;
- destructor Destroy; override;
- end;
- TClass2 = class(TAutoObject, interface2)
- ...
- public
- constructor Create;
- destructor Destroy; override;
- end;
- implementation
- procedure TClass1.notify(status: Integer);
- begin
- FHandler.OnNotify1(status); //在web中定义相应的函数名!!!
- end;
- constructor TClass1.Create;
- begin
- inherited; //注意要继承基类的,不继承的话,web调用将失败!!!
- ...;
- end;
- destructor TClass1.Destroy;
- begin
- ...;
- inherited;
- end;
- function TClass1.GetInterfaceSafetyOptions(const IID: TIID;
- pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult;
- begin
- pdwSupportedOptions :=
- INTERFACESAFE_FOR_UNTRUSTED_CALLER shr INTERFACESAFE_FOR_UNTRUSTED_DATA;
- Result := S_OK;
- end;
- function TClass1.SetInterfaceSafetyOptions(const IID: TIID;
- dwOptionSetMask, dwEnabledOptions: DWORD): HResult;
- begin
- Result := S_OK;
- end;
在上面TClass1中,FHandler是一个OleVariant类型,它是作为web事件通告使用。继承IObjectSafety是为了让web不弹出警告。同时还要将两个类注册:
- initialization
- TAutoObjectFactory.Create(ComServer, TClass1, Class_class1,
- ciMultiInstance, tmApartment);
- TAutoObjectFactory.Create(ComServer, TClass2, Class_class2,
- ciMultiInstance, tmApartment);
否则当web调用的时候将出错。