![]() |
WindowHandle vom Aktiven Renderer
Ich mache folgendes..
Delphi-Quellcode:
FVideoRenderer.FilterName ist in dem Fall "madVR"
function TEVMRPlayer.GetWindowHandle: HWND;
var pPin: IPIN; VideoRenderer: IBaseFilter; Overlay: IOverlay; HR: HRESULT; begin Result := 0; GraphBuilder.FindFilterByName(PWideChar(FVideoRenderer.VMRFilter), VideoRenderer); if Assigned(VideoRenderer) then begin HR := VideoRenderer.FindPin(nil, pPin); if (SUCCEEDED(HR)) then begin pPin.QueryInterface(IID_IOverlay, Overlay); Overlay.GetWindowHandle(Result); end; end; end; VideoRenderer liefert einen Zeiger ist also nicht Nil. aber trotzdem kracht es hier
Delphi-Quellcode:
VideoRenderer.FindPin(nil, pPin);
verstehe nicht warum.. jemand eine Idee? gruss |
AW: WindowHandle vom Aktiven Renderer
|
AW: WindowHandle vom Aktiven Renderer
Zitat:
Andere Version.. das gleiche.
Delphi-Quellcode:
HR Fails bei EVRBaseFilter.. und kracht bei madVRFilter
function TEVMRPlayer.GetWindowHandle: HWND;
var pPin: IPin; VideoRenderer: IBaseFilter; Overlay: IOverlay; HR: HRESULT; begin Result := 0; pPin := nil; // GraphBuilder.FindFilterByName(PWideChar(FVideoRenderer.VMRFilter), VideoRenderer); // if Assigned(VideoRenderer) then // begin HR := FVideoRenderer.VMRFilter.FindPin(nil, pPin); if (SUCCEEDED(HR)) then begin pPin.QueryInterface(IID_IOverlay, Overlay); Overlay.GetWindowHandle(Result); end; // end; end; Der sinn des ganzen ich benötige das WindowHandle des aktiven Rendere um ein Window drüberzulegen ohne jetzt extra ein zusätzliches Overlay zu generieren. ERROR = "Ein Object oder Name wurde nicht gefunden." madVRFilter ist valid.. Welches Object oder Name sollte dann da nicht gefunden werden? gruss |
AW: WindowHandle vom Aktiven Renderer
Hat sich erledigt.
Ein einfaches WindowFromPoint tut's auch. Wollte es wieder mal zu professional machen.. na was soll's Trotzdem seltsam das es nicht funktioniert hat. gruss |
AW: WindowHandle vom Aktiven Renderer
Zitat:
Die offizielle Dokumention sagt, dass der erste Parameter einen String(-Zeiger) enthalten muss, der den Pin identifiziert ( ![]() Wenn du da jetzt nil übergibst, versucht die implementierende Methode FindPin auf den Speicherbereich zuzugreifen -> es kracht! Im von Zwerg verlinkten SO-Beitrag ist ein Beispiel für das Enummerieren der Pins der übergebenen IBaseFilter-Instanz. Baue dir einen ähnlichen Code mit ein und lasse dir per OutputDebugString ausgeben, wie die korrekten Namen sind. |
AW: WindowHandle vom Aktiven Renderer
Zitat:
Nur es kracht trotzdem ;)
Delphi-Quellcode:
function FindConnectedPin(pFilter: IBaseFilter; PinDir: PIN_DIRECTION; var ppPin: IPin): HRESULT;
var pEnum: IEnumPins; pPin: IPin; hr: HRESULT; bFound: BOOL; bIsConnected: BOOL; begin ppPin := nil; pEnum := nil; pPin := nil; hr := pFilter.EnumPins(pEnum); if (FAILED(hr)) then begin result := hr; exit; end; bFound := FALSE; while (pEnum.Next(1, pPin, nil) = S_OK) do begin hr := IsPinConnected(pPin, bIsConnected); if (SUCCEEDED(hr)) then begin if (bIsConnected) then hr := IsPinDirection(pPin, PinDir, bFound); end; if (FAILED(hr)) then begin pPin := nil; break; end; if (bFound) then begin ppPin := pPin; break; end; pPin := nil; end; pEnum := nil; if (not bFound) then hr := VFW_E_NOT_FOUND; result := hr; end;
Delphi-Quellcode:
FindConnectedPin(FVideoRenderer.VMRFilter, PINDIR_INPUT, pPin);
Delphi-Quellcode:
pPin.QueryInterface(IID_IOverlay, Overlay);
Overlay ist Nil trotz gefundenen Pin und dann kracht es natürlich. (wenn nicht abgesichert) gruss |
AW: WindowHandle vom Aktiven Renderer
Zitat:
|
AW: WindowHandle vom Aktiven Renderer
Zitat:
Sonst könnte ich ja kein Overlay in Fenster anzeigen oder liege ich da falsch? Notfalls könnte ich das Overlay Interface bei der Initialisierung von Mad und den anderen Filtern noch hinzufügen. gruss |
AW: WindowHandle vom Aktiven Renderer
Zitat:
![]() In der Mitte des Textes (5. Absatz) findest du die Antwort auf die Frage: "Wer implementiert das IOverlay und wem kann ich demzufolge per QueryInterface fragen?" Spoiler: Es ist NICHT eine IPin-Instanz. |
AW: WindowHandle vom Aktiven Renderer
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz