Проблема в следующем:
1. Есть трансформ-фильтр DirectShow, написанный на C++.
2. Есть его исходники (соответственно, GUID'ы и описания методов)
3. Не могу реализовать на Дельфи...
Это — в interface.
type
TFilterSettings = record
a,b,c,d: integer;
end;
IVDiagFilter = interface(IBaseFilter)
['{D2648482-7B11-494d-BAB1-F7140F16ECDF}']
function GetParams(out Ef: integer; out Params: TFilterSettings): HRESULT; stdcall; // the media type selected
function SetParams(Ef: Integer; Params: TFilterSettings): HRESULT; stdcall; // the media type selected
end;
var
VDG: IBaseFilter;
это — в имплементэйшне.
function TDForm.AddFilterByCLSID(pGraph: IGraphBuilder;
GUID: TGUID; wszName: PWideChar; out ppF: IBaseFilter): HRESULT;
var
pF : IBaseFilter;
hr : Hresult;
begin
ppF := nil;
pf := nil;
hr := CoCreateInstance(GUID, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter,
pF);
if (SUCCEEDED(hr)) then
begin
hr := pGraph.AddFilter(pF, wszName);
if (SUCCEEDED(hr)) then
ppF := pF
else
pF._Release();
end;
Result := hr;
end;
И вот как я создаю обьект и вызываю его
AddFilterByCLSID((G as IGraphBuilder), CLSID_MyFilter, 'VDiag Filter', VDG);
Но как только такой вызов — получаю AccessViolation в ntdll.dll
(VDG as IVDiagFilter).SetParams(1013,RGB);
Кто что подскажет?