delphi实现web activex控件

目前在做一个项目,开发一个控件供给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、系统会自动帮你将第一个类声明和实现完成,手动加的接口和类必须自己实现。
  1. TClass1 = class(TAutoObject, IConnectionPointContainer, IObjectSafety,interface1)
  2. private
  3.   { Private declarations }
  4.   FConnectionPoints: TConnectionPoints;
  5.   FConnectionPoint: TConnectionPoint;
  6.   FEvents: IDeviceControlEvents;
  7.   { note: FEvents maintains a *single* event sink. For access to more
  8.   than one event sink, use FConnectionPoint.SinkList, and iterate
  9.   through the list of sinks. }    
  10.   function GetInterfaceSafetyOptions(const IID: TIID; pdwSupportedOptions,
  11.     pdwEnabledOptions: PDWORD): HResult; stdcall;
  12.   function SetInterfaceSafetyOptions(const IID: TIID; dwOptionSetMask,
  13.     dwEnabledOptions: DWORD): HResult; stdcall;
  14.   FHandler: OleVariant;
  15.   ...
  16. public
  17.   procedure notify(status: Integer);
  18. public
  19.   constructor Create;
  20.   destructor Destroy; override;
  21. end;
  22. TClass2 = class(TAutoObject, interface2)
  23.   ...
  24. public
  25.   constructor Create;
  26.   destructor Destroy; override;
  27. end;
  28. implementation
  29. procedure TClass1.notify(status: Integer);
  30. begin
  31.   FHandler.OnNotify1(status); //在web中定义相应的函数名!!!
  32. end;
  33. constructor TClass1.Create;
  34. begin
  35.   inherited; //注意要继承基类的,不继承的话,web调用将失败!!!
  36.   ...;
  37. end;
  38. destructor TClass1.Destroy;
  39. begin
  40.   ...;
  41.   inherited;
  42. end;
  43. function TClass1.GetInterfaceSafetyOptions(const IID: TIID;
  44.   pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult;
  45. begin
  46.   pdwSupportedOptions :=
  47.   INTERFACESAFE_FOR_UNTRUSTED_CALLER shr INTERFACESAFE_FOR_UNTRUSTED_DATA;
  48.   Result := S_OK;
  49. end;
  50. function TClass1.SetInterfaceSafetyOptions(const IID: TIID;
  51.   dwOptionSetMask, dwEnabledOptions: DWORD): HResult;
  52. begin
  53.   Result := S_OK;
  54. end;

在上面TClass1中,FHandler是一个OleVariant类型,它是作为web事件通告使用。继承IObjectSafety是为了让web不弹出警告。同时还要将两个类注册:

  1. initialization
  2.   TAutoObjectFactory.Create(ComServer, TClass1, Class_class1,
  3.     ciMultiInstance, tmApartment);
  4.   TAutoObjectFactory.Create(ComServer, TClass2, Class_class2,
  5.     ciMultiInstance, tmApartment);

否则当web调用的时候将出错。

 
阅读更多

没有更多推荐了,返回首页