zoukankan      html  css  js  c++  java
  • ActiveX内存泄漏

    一.ocx入口和dll入口一样

    var
      oServices: TThemeServices;
    begin
      Assert(IsLibrary);
      oServices := Themes.ThemeServices;
      System.RegisterExpectedMemoryLeak(oServices);
    end.

    二.创建控件

    1.  添加类TAFCActiveFormControl 

    2.  修改创建 

    initialization
      TActiveFormFactory.Create(
        ComServer,
        TAFCActiveFormControl,
        TAFCTest,
        Class_AFCTest,
        1,
        '',
        OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
        tmApartment);

    3.具体单元:

    代码
    unit AFCTestImpl;

    {$WARN SYMBOL_PLATFORM OFF}

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ActiveX, AxCtrls, AXTest_TLB, StdVcl, StdCtrls, TB2Item, TBX, TB2Dock,
      TB2Toolbar;

    type
      TAFCTest 
    = class(TActiveForm, IAFCTest)
        Button1: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        tb: TTBDock;
        TBToolbar1: TTBToolbar;
        TBXItem1: TTBXItem;
        TBXItem2: TTBXItem;
        TBXItem3: TTBXItem;
        TBXItem4: TTBXItem;
        
    procedure Button1Click(Sender: TObject);
      
    private
        
    { Private declarations }
        FEvents: IAFCTestEvents;
        
    procedure ActivateEvent(Sender: TObject);
        
    procedure ClickEvent(Sender: TObject);
        
    procedure CreateEvent(Sender: TObject);
        
    procedure DblClickEvent(Sender: TObject);
        
    procedure DeactivateEvent(Sender: TObject);
        
    procedure DestroyEvent(Sender: TObject);
        
    procedure KeyPressEvent(Sender: TObject; var Key: Char);
        
    procedure MouseEnterEvent(Sender: TObject);
        
    procedure MouseLeaveEvent(Sender: TObject);
        
    procedure PaintEvent(Sender: TObject);
      
    protected
        
    { Protected declarations }
        
    procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override;
        
    procedure EventSinkChanged(const EventSink: IUnknown); override;
        
    function Get_Active: WordBool; safecall;
        
    function Get_AlignDisabled: WordBool; safecall;
        
    function Get_AlignWithMargins: WordBool; safecall;
        
    function Get_AutoScroll: WordBool; safecall;
        
    function Get_AutoSize: WordBool; safecall;
        
    function Get_AxBorderStyle: TxActiveFormBorderStyle; safecall;
        
    function Get_Caption: WideString; safecall;
        
    function Get_Color: OLE_COLOR; safecall;
        
    function Get_DockSite: WordBool; safecall;
        
    function Get_DoubleBuffered: WordBool; safecall;
        
    function Get_DropTarget: WordBool; safecall;
        
    function Get_Enabled: WordBool; safecall;
        
    function Get_ExplicitHeight: Integer; safecall;
        
    function Get_ExplicitLeft: Integer; safecall;
        
    function Get_ExplicitTop: Integer; safecall;
        
    function Get_ExplicitWidth: Integer; safecall;
        
    function Get_Font: IFontDisp; safecall;
        
    function Get_HelpFile: WideString; safecall;
        
    function Get_KeyPreview: WordBool; safecall;
        
    function Get_MouseInClient: WordBool; safecall;
        
    function Get_PixelsPerInch: Integer; safecall;
        
    function Get_PopupMode: TxPopupMode; safecall;
        
    function Get_PrintScale: TxPrintScale; safecall;
        
    function Get_Scaled: WordBool; safecall;
        
    function Get_ScreenSnap: WordBool; safecall;
        
    function Get_SnapBuffer: Integer; safecall;
        
    function Get_UseDockManager: WordBool; safecall;
        
    function Get_Visible: WordBool; safecall;
        
    function Get_VisibleDockClientCount: Integer; safecall;
        
    procedure _Set_Font(var Value: IFontDisp); safecall;
        
    procedure Set_AlignWithMargins(Value: WordBool); safecall;
        
    procedure Set_AutoScroll(Value: WordBool); safecall;
        
    procedure Set_AutoSize(Value: WordBool); safecall;
        
    procedure Set_AxBorderStyle(Value: TxActiveFormBorderStyle); safecall;
        
    procedure Set_Caption(const Value: WideString); safecall;
        
    procedure Set_Color(Value: OLE_COLOR); safecall;
        
    procedure Set_DockSite(Value: WordBool); safecall;
        
    procedure Set_DoubleBuffered(Value: WordBool); safecall;
        
    procedure Set_DropTarget(Value: WordBool); safecall;
        
    procedure Set_Enabled(Value: WordBool); safecall;
        
    procedure Set_Font(const Value: IFontDisp); safecall;
        
    procedure Set_HelpFile(const Value: WideString); safecall;
        
    procedure Set_KeyPreview(Value: WordBool); safecall;
        
    procedure Set_PixelsPerInch(Value: Integer); safecall;
        
    procedure Set_PopupMode(Value: TxPopupMode); safecall;
        
    procedure Set_PrintScale(Value: TxPrintScale); safecall;
        
    procedure Set_Scaled(Value: WordBool); safecall;
        
    procedure Set_ScreenSnap(Value: WordBool); safecall;
        
    procedure Set_SnapBuffer(Value: Integer); safecall;
        
    procedure Set_UseDockManager(Value: WordBool); safecall;
        
    procedure Set_Visible(Value: WordBool); safecall;
      
    public
        
    { Public declarations }
        
    procedure Initialize; override;
      
    end;

      TAFCActiveFormControl 
    = class(TActiveFormControl)
      
    private
        
    procedure ReleaseOleLinkStub;
      
    public
        
    destructor Destroy; override;
      
    end;

    implementation

    uses
      ComObj, ComServ, GRPEngineUtils, GRPInterface;

    {$R *.DFM}

    type
    {$HINTS OFF}
    {$WARNINGS OFF}
      TGCPHackActiveXControl 
    = class(TAutoObject)
      
    private
        FControlFactory: TActiveXControlFactory;
        FConnectionPoints: TConnectionPoints;
        FPropertySinks: TConnectionPoint;
        FObjectSafetyFlags: DWORD;
        FOleClientSite: IOleClientSite;
        FOleControlSite: IOleControlSite;
        FSimpleFrameSite: ISimpleFrameSite;
        FAmbientDispatch: IAmbientDispatch;
        FOleInPlaceSite: IOleInPlaceSite;
        FOleInPlaceFrame: IOleInPlaceFrame;
        FOleInPlaceUIWindow: IOleInPlaceUIWindow;
        FOleAdviseHolder: IOleAdviseHolder;
        FDataAdviseHolder: IDataAdviseHolder;
        FAdviseSink: IAdviseSink;
        FAdviseFlags: Integer;
        FControl: TWinControl;
        FControlWndProc: TWndMethod;
        FWinControl: TWinControl;
        FIsDirty: Boolean;
        FInPlaceActive: Boolean;
        FUIActive: Boolean;
        FEventsFrozen: Boolean;
        FOleLinkStub: IInterface;
      
    end;
    {$WARNINGS ON}
    {$HINTS ON}

    { TAFCTest }

    procedure TAFCTest.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);
    begin
      
    { Define property pages here.  Property pages are defined by calling
        DefinePropertyPage with the class id of the page.  For example,
          DefinePropertyPage(Class_AFCTestPage); 
    }
    end;

    procedure TAFCTest.EventSinkChanged(const EventSink: IUnknown);
    begin
      FEvents :
    = EventSink as IAFCTestEvents;
      
    inherited EventSinkChanged(EventSink);
    end;

    procedure TAFCTest.Initialize;
    begin
      
    inherited Initialize;
      OnActivate :
    = ActivateEvent;
      OnClick :
    = ClickEvent;
      OnCreate :
    = CreateEvent;
      OnDblClick :
    = DblClickEvent;
      OnDeactivate :
    = DeactivateEvent;
      OnDestroy :
    = DestroyEvent;
      OnKeyPress :
    = KeyPressEvent;
      OnMouseEnter :
    = MouseEnterEvent;
      OnMouseLeave :
    = MouseLeaveEvent;
      OnPaint :
    = PaintEvent;
    end;

    function TAFCTest.Get_Active: WordBool;
    begin
      Result :
    = Active;
    end;

    function TAFCTest.Get_AlignDisabled: WordBool;
    begin
      Result :
    = AlignDisabled;
    end;

    function TAFCTest.Get_AlignWithMargins: WordBool;
    begin
      Result :
    = AlignWithMargins;
    end;

    function TAFCTest.Get_AutoScroll: WordBool;
    begin
      Result :
    = AutoScroll;
    end;

    function TAFCTest.Get_AutoSize: WordBool;
    begin
      Result :
    = AutoSize;
    end;

    function TAFCTest.Get_AxBorderStyle: TxActiveFormBorderStyle;
    begin
      Result :
    = Ord(AxBorderStyle);
    end;

    function TAFCTest.Get_Caption: WideString;
    begin
      Result :
    = WideString(Caption);
    end;

    function TAFCTest.Get_Color: OLE_COLOR;
    begin
      Result :
    = OLE_COLOR(Color);
    end;

    function TAFCTest.Get_DockSite: WordBool;
    begin
      Result :
    = DockSite;
    end;

    function TAFCTest.Get_DoubleBuffered: WordBool;
    begin
      Result :
    = DoubleBuffered;
    end;

    function TAFCTest.Get_DropTarget: WordBool;
    begin
      Result :
    = DropTarget;
    end;

    function TAFCTest.Get_Enabled: WordBool;
    begin
      Result :
    = Enabled;
    end;

    function TAFCTest.Get_ExplicitHeight: Integer;
    begin
      Result :
    = ExplicitHeight;
    end;

    function TAFCTest.Get_ExplicitLeft: Integer;
    begin
      Result :
    = ExplicitLeft;
    end;

    function TAFCTest.Get_ExplicitTop: Integer;
    begin
      Result :
    = ExplicitTop;
    end;

    function TAFCTest.Get_ExplicitWidth: Integer;
    begin
      Result :
    = ExplicitWidth;
    end;

    function TAFCTest.Get_Font: IFontDisp;
    begin
      GetOleFont(Font, Result);
    end;

    function TAFCTest.Get_HelpFile: WideString;
    begin
      Result :
    = WideString(HelpFile);
    end;

    function TAFCTest.Get_KeyPreview: WordBool;
    begin
      Result :
    = KeyPreview;
    end;

    function TAFCTest.Get_MouseInClient: WordBool;
    begin
      Result :
    = MouseInClient;
    end;

    function TAFCTest.Get_PixelsPerInch: Integer;
    begin
      Result :
    = PixelsPerInch;
    end;

    function TAFCTest.Get_PopupMode: TxPopupMode;
    begin
      Result :
    = Ord(PopupMode);
    end;

    function TAFCTest.Get_PrintScale: TxPrintScale;
    begin
      Result :
    = Ord(PrintScale);
    end;

    function TAFCTest.Get_Scaled: WordBool;
    begin
      Result :
    = Scaled;
    end;

    function TAFCTest.Get_ScreenSnap: WordBool;
    begin
      Result :
    = ScreenSnap;
    end;

    function TAFCTest.Get_SnapBuffer: Integer;
    begin
      Result :
    = SnapBuffer;
    end;

    function TAFCTest.Get_UseDockManager: WordBool;
    begin
      Result :
    = UseDockManager;
    end;

    function TAFCTest.Get_Visible: WordBool;
    begin
      Result :
    = Visible;
    end;

    function TAFCTest.Get_VisibleDockClientCount: Integer;
    begin
      Result :
    = VisibleDockClientCount;
    end;

    procedure TAFCTest._Set_Font(var Value: IFontDisp);
    begin
      SetOleFont(Font, Value);
    end;

    procedure TAFCTest.ActivateEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnActivate;
    end;

    procedure TAFCTest.Button1Click(Sender: TObject);
    var
      iDataSrore: IGRPDataStore;
      iEngine: IGRPEngine;
    begin
    //  oGRPEngine := GRPEngine;
    //  oGRPEngine := nil;
    //  FreeEngine;


      iDataSrore :
    = GRPEngine.CreateDataStore;
      iDataSrore :
    = nil;
      FreeEngine;
      ShowMessage(Edit1.Text);
    end;

    procedure TAFCTest.ClickEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnClick;
    end;

    procedure TAFCTest.CreateEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnCreate;
    end;

    procedure TAFCTest.DblClickEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnDblClick;
    end;

    procedure TAFCTest.DeactivateEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnDeactivate;
    end;

    procedure TAFCTest.DestroyEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnDestroy;
    end;

    procedure TAFCTest.KeyPressEvent(Sender: TObject; var Key: Char);
    var
      TempKey: Smallint;
    begin
      TempKey :
    = Smallint(Key);
      
    if FEvents <> nil then FEvents.OnKeyPress(TempKey);
      Key :
    = Char(TempKey);
    end;

    procedure TAFCTest.MouseEnterEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnMouseEnter;
    end;

    procedure TAFCTest.MouseLeaveEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnMouseLeave;
    end;

    procedure TAFCTest.PaintEvent(Sender: TObject);
    begin
      
    if FEvents <> nil then FEvents.OnPaint;
    end;

    procedure TAFCTest.Set_AlignWithMargins(Value: WordBool);
    begin
      AlignWithMargins :
    = Value;
    end;

    procedure TAFCTest.Set_AutoScroll(Value: WordBool);
    begin
      AutoScroll :
    = Value;
    end;

    procedure TAFCTest.Set_AutoSize(Value: WordBool);
    begin
      AutoSize :
    = Value;
    end;

    procedure TAFCTest.Set_AxBorderStyle(Value: TxActiveFormBorderStyle);
    begin
      AxBorderStyle :
    = TActiveFormBorderStyle(Value);
    end;

    procedure TAFCTest.Set_Caption(const Value: WideString);
    begin
      Caption :
    = TCaption(Value);
    end;

    procedure TAFCTest.Set_Color(Value: OLE_COLOR);
    begin
      Color :
    = TColor(Value);
    end;

    procedure TAFCTest.Set_DockSite(Value: WordBool);
    begin
      DockSite :
    = Value;
    end;

    procedure TAFCTest.Set_DoubleBuffered(Value: WordBool);
    begin
      DoubleBuffered :
    = Value;
    end;

    procedure TAFCTest.Set_DropTarget(Value: WordBool);
    begin
      DropTarget :
    = Value;
    end;

    procedure TAFCTest.Set_Enabled(Value: WordBool);
    begin
      Enabled :
    = Value;
    end;

    procedure TAFCTest.Set_Font(const Value: IFontDisp);
    begin
      SetOleFont(Font, Value);
    end;

    procedure TAFCTest.Set_HelpFile(const Value: WideString);
    begin
      HelpFile :
    = string(Value);
    end;

    procedure TAFCTest.Set_KeyPreview(Value: WordBool);
    begin
      KeyPreview :
    = Value;
    end;

    procedure TAFCTest.Set_PixelsPerInch(Value: Integer);
    begin
      PixelsPerInch :
    = Value;
    end;

    procedure TAFCTest.Set_PopupMode(Value: TxPopupMode);
    begin
      PopupMode :
    = TPopupMode(Value);
    end;

    procedure TAFCTest.Set_PrintScale(Value: TxPrintScale);
    begin
      PrintScale :
    = TPrintScale(Value);
    end;

    procedure TAFCTest.Set_Scaled(Value: WordBool);
    begin
      Scaled :
    = Value;
    end;

    procedure TAFCTest.Set_ScreenSnap(Value: WordBool);
    begin
      ScreenSnap :
    = Value;
    end;

    procedure TAFCTest.Set_SnapBuffer(Value: Integer);
    begin
      SnapBuffer :
    = Value;
    end;

    procedure TAFCTest.Set_UseDockManager(Value: WordBool);
    begin
      UseDockManager :
    = Value;
    end;

    procedure TAFCTest.Set_Visible(Value: WordBool);
    begin
      Visible :
    = Value;
    end;

    { TAFCActiveFormControl }

    destructor TAFCActiveFormControl.Destroy;
    begin
      ReleaseOleLinkStub;

      
    inherited;
    end;

    ////////////////////////////////////////////////////////////////////////////////
    //设计: Linc 2010.02.02
    //功能: 主要是为了修正 TOleLinkStub 内存泄漏
    //参数:
    //注意: 按照局部变量在内存中的分布,获取 OleLinkStub 的指针
    ////////////////////////////////////////////////////////////////////////////////
    procedure TAFCActiveFormControl.ReleaseOleLinkStub;
    var
      cLinkStub: IInterface;
    begin
    {$DEFINE SHOWWARN}

    {$IFDEF VER150}
      
    {$UNDEF SHOWWARN}
    {$ENDIF}
    {$IFDEF VER170}
      
    {$UNDEF SHOWWARN}
    {$ENDIF}
    {$IFDEF VER180}
      
    {$UNDEF SHOWWARN}
    {$ENDIF}

    {$IFDEF SHOWWARN}
      
    {$MESSAGE WARN '非 Delphi 7/2005/2006/2007 中 OleLinkStub 的内存分布常量有可能有不同!'}
      cLinkStub :
    = nil;
    {$ELSE}
      cLinkStub :
    = TGCPHackActiveXControl(Self).FOleLinkStub;
    {$ENDIF}
      
    if Assigned(cLinkStub) then
      
    try
        cLinkStub._Release;
      
    finally
        cLinkStub :
    = nil;
      
    end;
    {$UNDEF SHOWWARN}
    end;

    initialization
      TActiveFormFactory.Create(
        ComServer,
        TAFCActiveFormControl,
        TAFCTest,
        Class_AFCTest,
        
    1,
        
    '',
        OLEMISC_SIMPLEFRAME 
    or OLEMISC_ACTSLIKELABEL,
        tmApartment);
    end.
  • 相关阅读:
    MsSql数据库存储过程加密解密
    Delete Exists
    SQL Server 2008数据库日志收缩
    MSSQL PIVOT 实现行列转置
    Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
    oracle的分析函数over 及开窗函数
    Asprise-OCR的使用
    【整理】动态加载Web Services
    【转载】Python正则表达式指南
    Mac中PyCharm设置GitHub的步骤
  • 原文地址:https://www.cnblogs.com/SouthAurora/p/1696095.html
Copyright © 2011-2022 走看看