/newStructBase/tangram framework/SysSvc.pas

https://github.com/qriver/Delphi2010 · Pascal · 77 lines · 54 code · 14 blank · 9 comment · 5 complexity · 3b97834ed35b79d729e748bf1f0f0ecc MD5 · raw file

  1. {------------------------------------
  2. ?????????
  3. ?????2008/11/09
  4. ???wzw
  5. ???wzw
  6. -------------------------------------}
  7. unit SysSvc;
  8. interface
  9. uses SysUtils,Windows,Classes,FactoryIntf;
  10. Type
  11. TSysService=Class(TObject,IInterface)
  12. private
  13. FRefCount: Integer;
  14. protected
  15. function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  16. function _AddRef: Integer; stdcall;
  17. function _Release: Integer; stdcall;
  18. public
  19. // Constructor Create;
  20. // Destructor Destroy;override;
  21. end;
  22. function SysService:IInterface;
  23. implementation
  24. uses SysFactoryMgr;
  25. var
  26. FSysService:IInterface;
  27. function SysService:IInterface;
  28. begin
  29. if not Assigned(FSysService) then
  30. FSysService:=TSysService.Create;
  31. Result:=FSysService;
  32. end;
  33. { TSysService }
  34. function TSysService._AddRef: Integer;
  35. begin
  36. Result := InterlockedIncrement(FRefCount);
  37. end;
  38. function TSysService._Release: Integer;
  39. begin
  40. Result := InterlockedDecrement(FRefCount);
  41. if Result = 0 then
  42. Destroy;
  43. end;
  44. function TSysService.QueryInterface(const IID: TGUID; out Obj): HResult;
  45. var aFactory:TFactory;
  46. begin
  47. Result:=E_NOINTERFACE;
  48. if self.GetInterface(IID,Obj) then
  49. Result:=S_OK
  50. else begin
  51. aFactory:=FactoryManager.FindFactory(IID);
  52. if Assigned(aFactory) then
  53. begin
  54. aFactory.CreateInstance(IID,Obj);
  55. Result:=S_OK;
  56. end;
  57. end;
  58. end;
  59. initialization
  60. FSysService:=nil;
  61. finalization
  62. FSysService:=nil;
  63. end.