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.

 

 

 

posted @ 2010-03-25 19:11  SouthAurora  Views(1373)  Comments(0Edit  收藏  举报