Seite 1 von 3
Graph in der ROT registrieren - wie?
Verfasst: 11.03.2005 21:08
von normen
Gibt es in PureBasic einen einfachen Weg, einen Directshow Graph in der Running Objects Table zu registrieren, oder den Graph in eine .grf Datei zu schreiben, so dass man mittels GraphEdit debuggen kann?
Ich habe auf der Microsoft website einige C++ Funktionen dafuer gefunden, kenne mich aber leider weder mit C++ noch mit PureBasic gut genug aus, um diese Funktionen anpassen und nutzen zu koennen.
Ich hoffe, dass schonmal jemand was damit gemacht hat.
Im Voraus vielen Dank!!!
Verfasst: 13.03.2005 02:03
von Laurin
Öhm
Ich hab zwar nicht ganz verstanden, was du da machen willst, aber es hört sich so kompliziert an, dass du es als PB-Anfänger da wohl kaum was tun kannst.
Überleg mal, ob es Alternativen zu der Vorgehensweise gibt, die du beschrieben hast. Eventuell vielleicht bringt das die Lösung näher.
Greetz Laurin
Verfasst: 13.03.2005 04:00
von normen
Die einzige Alternative, die mir bisher eingefallen ist, ist raten. Meine Erfahrung zeigt mir jedoch, dass diese Methode nicht immer sehr zuverlaessig ist.
Der Grund warum ich das machen will ist, herauszufinden, welche DirectShow Filter tatsaechlich verwendet werden und wie diese miteinander verbunden sind. Gerade wenn man verschiedene Renderer verwendet (Overlay, VMR7, VMR9, windowed, windowless, ...) dann ist es wichtig zu wissen, ob auch tatsaechlich der gewuenschte Renderer verwendet wird.
Noch wichtiger wird das ganze wenn man Capture Devices mittels WDM Filter verwendet. Ich kann mir vorstellen, dass es ohne eine Debugmoeglichkeit mit GraphEdit zu einem Alptraum werden kann, einen Fehler zu finden.
Verfasst: 13.03.2005 14:06
von Laurin
Der Grund warum ich das machen will ist, herauszufinden, welche DirectShow Filter tatsaechlich verwendet werden und wie diese miteinander verbunden sind.
Da braucht man wohl Kenntnisse in DirectX, die hier im Board die Meisten sicher nicht haben (sonst hätten die schon was gepostet).
Du hattest gepostet, dass es C++ Codes für dein Anliegen gibt. Vielleicht kann man sie nach PB portieren. Poste sie doch bitte hier.
Verfasst: 13.03.2005 23:57
von normen
Hast ja Recht, ich haette diese Funktionen schon lange mal hier posten koennen.
Hier sind mal zwei Links.
Graphen in der ROT registrien:
http://msdn.microsoft.com/library/en-us ... frame=true
Graphen in eine .grf Datei schreiben:
http://msdn.microsoft.com/library/en-us ... frame=true
Wie gesagt, ich habe keine Ahnung, wie ich diese Funktionen nach PB uebersetzen koennte. Vielleicht kann das ja jemand anders.
Verfasst: 14.03.2005 00:06
von Laurin
Uff, ich kann zwar ein wenig C, aber das ist mir zu hoch.
Verfasst: 14.03.2005 00:33
von traumatic
Sieht auf den ersten Blick wirklich nicht allzu kompliziert aus.
Wie wär's wenn Du einfach mal anfängst, das ganze zu übersetzen (Bitte aus
den SDK-Examples, nicht von der MSDN-Seite). Sobald Du auf Probleme stösst,
können diese sicherlich im Forum "gemeinsam erarbeitet" werden.
Du hast ja bereits einen Code in der Hand, der quasi 1:1 aus dem SDK übersetzt
wurde - mit ein wenig Transferleistung und meinetwegen google sollte dies
IMHO auch für jemanden, der C/C++ nicht fliessend spricht, zu bewerkstelligen
sein.
Viele hier, einschließlich mir, sind sicherlich gerne bereit Dir dabei zu helfen.
Persönlich weigere ich mich aber, Dir einfach den kompletten Code zu übersetzen

Verfasst: 14.03.2005 15:28
von traumatic
Weil Du immer so lieb danke sagst

, habe ich Dir - entgegen meinen Grundsätzen -
mal eben die Funktion AddToRot() übersetzt. Ist wirklich nichts schlimmes.
Das sollte Dich zumindest (so hoffe ich) auf den richtigen Weg bringen:
Code: Alles auswählen
#ROTFLAGS_REGISTRATIONKEEPSALIVE = $01
Structure WCHAR
c.w[#MAX_PATH]
EndStructure
Procedure.l AddToRot(*pUnkGraph.IUnknown, *pdwRegister.l)
*pMoniker.IMoniker
*pROT.IRunningObjectTable
If GetRunningObjectTable_(0, @*pROT) <> 0
ProcedureReturn #E_FAIL
EndIf
sz.s = "FilterGraph "+LCase(RSet(Hex(*pUnkGraph), 8, "0"))+" pid "+LCase(RSet(Hex(GetCurrentProcessId_()), 8, "0"))
MultiByteToWideChar_(#CP_ACP, 0, sz, -1, @wsz.WCHAR, Len(sz))
MultiByteToWideChar_(#CP_ACP, 0, "!", -1, @wsz2.WCHAR, 1)
hr.l = CreateItemMoniker_(wsz2, wsz, @*pMoniker)
If hr = 0
hr = *pROT\Register(#ROTFLAGS_REGISTRATIONKEEPSALIVE, *pUnkGraph, *pMoniker, *pdwRegister)
*pMoniker\Release()
EndIf
*pROT\Release()
ProcedureReturn hr
EndProcedure
Ich hab's mal ausprobiert - funktioniert sogar

(graphedit.exe -> File / Connect to Remote Graph)
Bzgl. der etwas hakelig aussehenden WideChar-Konstrukte bin ich für Vorschläge offen.
Makros wären cool...
Achso: Wg. des LCase() bin ich mir nicht sicher, ob das tatsächlich benötigt wird,
der Original-Code generiert aber auch kleine Buchstaben (%08x / %08X)
Man hätte natürlich auch direkt wsprintfW() (user32.dll) benutzen können,
ich fand's so aber einfach anschaulicher.
So... ich hoffe, das hilft!
Verfasst: 14.03.2005 18:02
von normen
traumatc,
Ich weiss gar nicht, wie ich das alles wieder gut machen kann. (Mal wieder) Vielen, vielen Dank.
Aber von nun an moechte ich, dass Du zu Deinen Grundsaetzen stehst.
Wie wär's wenn Du einfach mal anfängst, das ganze zu übersetzen (Bitte aus
den SDK-Examples, nicht von der MSDN-Seite). Sobald Du auf Probleme stösst,
können diese sicherlich im Forum "gemeinsam erarbeitet" werden.
...
Viele hier, einschließlich mir, sind sicherlich gerne bereit Dir dabei zu helfen.
Persönlich weigere ich mich aber, Dir einfach den kompletten Code zu übersetzen
Damit hast Du voellig Recht. Asche auf mein Haupt.

Verfasst: 14.03.2005 21:30
von traumatic
EDIT: DOUBLE TRIPLE WHATEVER POST
