Hi,
ich habe heute krampfhaft versucht DRM geschützte Formate über Directshow abzuspielen. Das Problem was ich habe ist folgendes: Ich finde auf der
MSDN Seite nirgends eine Version der wmvcore.lib in welcher WMCreateCertificate zu finden ist
Theoretisch sollte für die Wiedergabe von DRM Material ja folgender Code ausreichen:
Delphi-Quellcode:
TKeyProvider = class(TInterfacedObject, IServiceProvider)
function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall;
end;
...
function TKeyProvider.QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall;
var
punkCert: IUnknown;
LibHandle: Cardinal;
WMCreateCertificate: function(out pUnkCert: IUnknown): HRESULT; stdcall;
begin
result := E_NOINTERFACE;
if (isEqualGUID(rsid, IID_IWMReader)) then
begin
LibHandle := LoadLibrary('wmvcore.dll'); // <-- Jaja ich weiß, da war die Funktion mal drin...
if (LibHandle > 0) then
begin
WMCreateCertificate := GetProcAddress(LibHandle, 'WMCreateCertificate');
if assigned(WMCreateCertificate) then
begin
result := WMCreateCertificate(punkCert);
if SUCCEEDED(result) then IUnknown(obj) := punkCert;
end;
end else result := E_FAIL;
freeLibrary(LibHandle);
end;
end;
function TForm1.AddKeyProvider(const pGraph: IGraphBuilder): HRESULT;
var ObjectWithSite: IObjectWithSite;
const
IID_IObjectWithSite: TGuid = '{FC4801A3-2BA9-11CF-A229-00AA003D7352}';
begin
result := pGraph.QueryInterface(IID_IObjectWithSite, ObjectWithSite);
if SUCCEEDED(result) then
result := ObjectWithSite.SetSite(FProvider);
end;
procedure TForm1.LoadFromFile(const Filename: string);
var
Filter: IBaseFilter;
source: IFileSourceFilter;
EP: IEnumPins;
outPin: IPin;
ff: ULONG;
begin
FProvider := TKeyProvider.Create;
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC,
IID_IFilterGraph2, FGraph);
CoCreateInstance(CLSID_WMAsfReader, nil,
CLSCTX_INPROC, IID_IBaseFilter, Filter);
Fgraph.AddFilter(Filter, 'ASF Source');
AddKeyProvider(FGraph);
Filter.QueryInterface(IID_IFileSourceFilter, source);
Source.Load(PWideChar(WideString(Filename)), nil);
Filter.EnumPins(EP);
EP.Reset;
while EP.Next(1, outpin, @ff) = S_OK do
FGraph.Render(outpin);
EP := nil;
FGraph.QueryInterface(IID_IMediaControl, FMC);
FMC.Run;
end;
Hinweise und Links zu obiger Lib nehme ich dankbar entgegen :wub:
Peter