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;