Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#17

AW: Verwenden von IAMMediaContent

  Alt 6. Okt 2018, 08:40
Hui das Ding kannte ich auch noch nicht, SysFreeString, müßte das nicht noch in dem " if DYDYoutubeFilter <> nil then" block aufgerufen werden anstelle nur im "if not SUCCEEDED(Result) then" block?
Du musst es nur dann aufrufen, wenn du etwas zurückbekommen hast.

Ein Aufruf mit nil ist aber unkritisch von daher kann man es pauschal immer aufrufen, muss man aber nicht.

Denkbar ist also auch
Delphi-Quellcode:
uses
  ...
  Winapi.ActiveX;

function TEVMRPlayer.GetYoutubeFilterTitle(out Title: string): HRESULT;
var
  MediaContent: IAMMediaContent;
  pbstrTitle: {Winapi.ActiveX.}TBSTR;
begin

  Result := E_FAIL;

  if not Assigned(srcFilter) then
    exit;

  if IsUrl then
  begin
    if DYDYoutubeFilter <> nil then
    begin
      srcFilter.QueryInterface(IID_IAMMediaContent, MediaContent);
      pbstrTitle := nil;
      try
        Result := MediaContent.get_Title(pbstrTitle);
        if not SUCCEEDED(Result) then
          ReportError('YoutubeFilterTitle fails', Result)
        else
          Title := OleStrToString(pbstrTitle);
      finally
        {Winapi.ActiveX.}SysFreeString(pbstrTitle);
      end;
    end;
  end;
end;
PS

Wer meint, er kann darauf nicht reinfallen, weil er mit ReportMemoryLeaksOnShutdown := true arbeitet, dem sei gesagt, dass hier gar nichts gemeldet wird.

Kleiner Test (bei der Ausführung einen Blick auf den Taskmanager und den verwendeten Arbeitsspeicher haben)
Delphi-Quellcode:
uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class( TForm )
    Button1: TButton;
    FreeString_CheckBox: TCheckBox;
    procedure Button1_Click( Sender: TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses
  Winapi.ActiveX, System.StrUtils;

{$R *.dfm}

function GetString( AFreeString: boolean ): string;
var
  pbstrTemp: TBSTR;
begin
  pbstrTemp := StringToOleStr( DupeString( 'TestTest', 4096 ) );
  try
    Result := OleStrToString( pbstrTemp );
  finally
    if AFreeString
    then
      SysFreeString( pbstrTemp );
  end;
end;

procedure TForm1.Button1_Click( Sender: TObject );
var
  r: string;
  I: Integer;
begin
  ReportMemoryLeaksOnShutdown := True;
  for I := 1 to 4096 do
    begin
      r := GetString( FreeString_CheckBox.Checked );
    end;
end;

Geändert von Schokohase ( 6. Okt 2018 um 08:47 Uhr)
  Mit Zitat antworten Zitat