![]() |
C++ Delphi Übersetzung 3DYDYoutube Filter
Ich baue gerade den Filter für YouTube in meine Library ein.
Und muss das übersetzen.
Code:
interface __declspec(uuid("FF762ACC-13EC-463A-A29C-FD4B0CD3E019"))
ISupportedSites: public IUnknown { enum { kVersion = 5 }; // Version number equals to total number of functions within the interface // (ISupportedSites::kVersion is the current version). New functions are // appended to the interface. Function signatures are never change. Therefore // version number is the way to check whether particular function is available // in the interface STDMETHOD_(UINT, GetVersion)() = 0; // Number of supported sites STDMETHOD_(UINT, GetCount)() = 0; // Get site name or NULL if index >= GetCount() STDMETHOD_(BSTR, GetName)(UINT index) = 0; // Test whether url can be analyzed for video retrieving. S_FALSE means that // url seems from the supported site but not a valid video clip page. When // S_OK is returned, canonical_url will contain canonical page url, otherwise // it will not be changed // If explicitly == TRUE then S_OK will be returned only if URL definitely // points to video page URL instead of maybe just to some other page from the // supported site. This can be determined only for few sites, for others need // page data to determine this STDMETHOD(Test)(__in LPCWSTR url, __in BOOL explicitly, __out_opt BSTR* canonical_url) = 0; // Returns clip start time encoded in URL, in milliseconds STDMETHOD_(UINT, GetStartTime)(LPCWSTR url) = 0; };
Delphi-Quellcode:
Sollte eigentlich in Ordnung sein.
ISupportedSites = interface(IUnknown)
['{FF762ACC-13EC-463A-A29C-FD4B0CD3E019}'] (* ** ISupportedSites methods ** *) function GetVersion: UINT; stdcall; function GetCount: UINT; stdcall; function GetName(index: UINT): string; stdcall; function Test(url: PWideChar; explicitly: BOOL; out canonical_url: string): HRESULT; stdcall; function GetStartTime(url: PWideChar): UINT; stdcall; end; Wenn nicht bitte mitteilen was nicht stimmt. Frage mich nur wie soll ich das Enum dazwischen klatschen. (Das ist meine Frage) ;)
Code:
enum { kVersion = 5 };
![]() gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Das sollte ein Property darstellen des Typs Int.
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Delphi-Quellcode:
edit
ISupportedSites = interface(IUnknown)
['{FF762ACC-13EC-463A-A29C-FD4B0CD3E019}'] kVersion = 5; // so vielleicht? (* ** ISupportedSites methods ** *) function GetVersion: UINT; stdcall; function GetCount: UINT; stdcall; function GetName(index: UINT); stdcall; procedure Test(url: PWideChar; explicitly: BOOL; var canonical_url: string); stdcall; function GetStartTime: UINT; stdcall; end; also kVersion muss etwas sein wo als wert ne 5 zurückkommt, vielleicht macht man das bei interface auch anders, per function oder so... |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Nebenbei du hast zu früh kopiert habe noch etwas nachgebessert ;) Das Video läuft schon mal. Anbei ein Pic. Was mir fehlt ist die Weite\höhe, Gesamt und verstrichene Zeit. Im Moment geht es nur über eine Verknüpfung mit Dragdrop. (Habe keine Liste) Nun gut ist noch was zu tun. gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
ja sorry, bin schon total schlaff auf den augen, wusste nur worauf ich hinaus wollte weil du nur das eine angefragt hattest.
aber.... ich glaube mich rar zu erinnern das man dabei ne function mit fest-ergebnis nehmen sollte.... manno... bin grad voll am grübeln/zweifeln wenn es nun läuft scheints das ja gewesen zu sein, tolle sache auch mal das richtige für dich gehabt zu haben :party: |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Habe immer noch ein C++ Problem. :oops:
Code:
Kann da bitte jemand bei der Übersetzung helfen? Danke
CComPtr<IBaseFilter> source;
if (FAILED(hr = source.CoCreateInstance(__uuidof(IYoutubeSource)))) { return VLC_EGENERIC; } CComQIPtr<ISupportedSites> ss = source; if (!ss) { return VLC_EGENERIC; } CComBSTR url; if (S_OK != (hr = ss->Test(original_url.c_str(), FALSE, &url))) { return VLC_EGENERIC; } Habe es mal auf diese weise versucht.
Delphi-Quellcode:
URL ist immer leer. :wall:
if DYDYoutubeFilter <> nil then
begin hr := CoCreateInstance(CLSID_DYDYoutube, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, Source); if SUCCEEDED(hr) then SupportedSites := ISupportedSites(Source); hr := SupportedSites.Test(PWideChar(MediaFile), false, url); if SUCCEEDED(hr) then begin end; end; gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Ich bin gerade privat eingebunden, aber falls es Dich interessieren sollte,
![]() |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Na ja vielleicht ist @Zacherl die Tage online. gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Habe leider auch nicht wirklich Ahnung, wie
Delphi-Quellcode:
definiert ist (die wäre wichtig), aber die Übersetzung als
BSTR*
Delphi-Quellcode:
ist ziemlich sicher falsch (den Delphi String Typen kennt C++ nicht).
out string
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
WideString bzw PChar sollte ein BSTR darstellen falls das hilft.
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Es scheint aber ein Pointer zu sein
Code:
Nun in dem Fall wäre es PWideString und das hab ich schon versucht es liefert keinen verwendbaren string zurück.
BSTR*
Hier ist irgend etwas noch unverständlich für mich also die Übersetzung.
Code:
bin mir nicht sicher ob das richtig ist!
CComPtr<IBaseFilter> source;
if (FAILED(hr = source.CoCreateInstance(__uuidof(IYoutubeSource)))) { return VLC_EGENERIC; } CComQIPtr<ISupportedSites> ss = source; if (!ss) { return VLC_EGENERIC; } CComBSTR url; if (S_OK != (hr = ss->Test(original_url.c_str(), FALSE, &url))) { return VLC_EGENERIC; }
Delphi-Quellcode:
Source basierend auf IBaseFilter oder auf IFileSourceFilter.var URL: PWideString; Source: IBaseFilter; //oder IFileSourceFilter //... if DYDYoutubeFilter <> nil then begin hr := CoCreateInstance(CLSID_DYDYoutube, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, Source); if SUCCEEDED(hr) then SupportedSites := ISupportedSites(Source); hr := SupportedSites.Test(PWideChar(MediaFile), false, url); if SUCCEEDED(hr) then begin end; end; Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Mir fehlt da gerade ein Testprojekt, versuche mal PWideChar anstelle PWideString.
Eventuell muss man noch mit SetLength() da was machen? Was sagt Debugger zu URL? |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Zitat:
EDIT: Und das ist auch fraglich..
Delphi-Quellcode:
SupportedSites := ISupportedSites(Source);
Zitat:
Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Delphi-Quellcode:
bzw.
QueryInterface()
Delphi-Quellcode:
arbeiten statt.
Supports()
Ist der String tatsächlich valide, aber leer, oder
Delphi-Quellcode:
? Und hast du jetzt
nil
Delphi-Quellcode:
oder
PWideChar
Delphi-Quellcode:
genommen? Wenn die Deklaration hier richtig ist:
var PWideChar
Code:
sollte letzteres korrekt sein.
typedef unsigned short wchar_t;
typedef wchar_t WCHAR; typedef WCHAR OLECHAR; typedef OLECHAR* BSTR; |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Delphi-Quellcode:
sein. Denke sogar eher
PWideChar
Delphi-Quellcode:
der Typdefinition nach zu schließen.
var PWideChar
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Zitat:
Ok dann lieber nicht ;) Mein Problem ist das hr = 0 zurück liefert von daher geht man erst mal davon aus das alles in Ordnung ist. Nur zurückgegeben wird nix. Zitat:
Zitat:
Code:
if (FAILED(hr = source.CoCreateInstance(__uuidof(IYoutubeSource)))) {
return VLC_EGENERIC; Zitat:
Hmmm... gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
[QUOTE=EWeiss;1414962]
Zitat:
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Ich brauche kein OleCheck hr ist mein OleCheck! Ist hr = 0 dann sollte normalerweise alles in Ordnung sein. gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
So bin etwas weiter.. Mist wenn man alles selbst herausfinden muss ohne vernünftiges SDK :stupid:
Habe eine IID_angelegt und zwar die des Interface ISupportedSites.
Delphi-Quellcode:
IID_ISupportedSites: TGUID = '{FF762ACC-13EC-463A-A29C-FD4B0CD3E019}';
War mir jetzt nicht sicher ob ich mit dieser IID_ arbeiten kann scheint aber richtig zu sein um das Interface zu Initialisieren.
Delphi-Quellcode:
Die Url bei SupportedSites.Test ist immer noch Nil sei's drum.
IsURL := (LeftStr(MediaFile, 4) = 'http') or (LeftStr(MediaFile, 5) = 'https');
if IsUrl then begin if DYDYoutubeFilter <> nil then begin hr := CoCreateInstance(CLSID_DYDYoutube, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, Source); if SUCCEEDED(hr) then begin Source.QueryInterface(IID_ISupportedSites, SupportedSites); Version := SupportedSites.GetVersion; hr := SupportedSites.Test(PWideChar(MediaFile), false, url); if SUCCEEDED(hr) then begin x := SupportedSites.GetCount; if x <> 0 then begin for IntI := 0 to x - 1 do Test := SupportedSites.GetName(IntI); end; end; end; end; end; So wie ich das hier verstehe.. Zitat:
GetCount hingegen stimmt genauso werden mir die unterstützten Url's zurückgegeben die der Filter unterstützt. Siehe Pic! Die werte stimmen alle. Muss jetzt noch schauen wie ich das mit der Url hinbekomme. Das stimmt jetzt schon mal!
Delphi-Quellcode:
gruss
function GetVersion: UINT; stdcall;
// Number of supported sites function GetCount: UINT; stdcall; // Get site name or NULL if index >= GetCount() function GetName(index: UINT): PWideChar; stdcall; |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
![]() Ist das wohl aktuell ? |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Also BSTR ist WideString auf Delphi Seite.
Delphi-Quellcode:
wäre meines Wissens nach die richtige Übersetzung
function GetName(index: UINT): WideString; stdcall;
function Test(url: PWideChar; explicitly: BOOL; out canonical_url: WideString): HRESULT; stdcall; |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Zitat:
Delphi-Quellcode:
kommt mir allerdings sehr komisch vor, da dies ein Delphi Typ mit Ref-Counter und allem drum und dran ist.
WideString
So oder so ist der Output Zeiger ja
Delphi-Quellcode:
. Entsprechend der Dokumentation der Funktion ist das ja in Ordnung, falls
nil
Delphi-Quellcode:
zurückgeliefert wird. Jetzt kommt der Knackpunkt:
S_FALSE
Zitat:
Delphi-Quellcode:
Makro jeweils
SUCCEEDED()
Delphi-Quellcode:
zurück. Hier müsstest du also nachher noch explizit auf
true
Delphi-Quellcode:
oder
S_OK
Delphi-Quellcode:
testen.
S_FALSE
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
![]() Also wir benutzten dass hier häufig. (gemixte source VS C++ und Delphi) Das schöne daran, Windows übernimmt die Speicherverwaltung. Aber: Es ist nicht unbedingt das schnellste. |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Ok Danke euch..
Delphi-Quellcode:
function GetName(index: UINT): PWideChar; stdcall;
Hmm.. bin mir nicht sicher und zwar deshalb weil GetName mir die richtigen werte liefert ;) Dann gibt es noch den Unterschied BSTR und BSTR* gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Getestet. Falsch! liefert leer String zurück.
Delphi-Quellcode:
function GetName(index: UINT): WideString; stdcall;
Richtig!
Delphi-Quellcode:
function GetName(index: UINT): PWideChar; stdcall;
PWideString liefert falsche Werte. gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Das tue ich doch.
Delphi-Quellcode:
hr := SupportedSites.Test(PWideChar(MediaFile), false, url);
Die frage die da noch wäre ist das nun eine Procedure oder eine Funktion!
Code:
Sieht mir nach procedure aus, wenn dem so ist wie soll ich dann auf S_OK\S_FALSE testen?
STDMETHOD(Test)(__in LPCWSTR url, __in BOOL explicitly, __out_opt BSTR* canonical_url) = 0;
Ich habe es als Function ausgelegt da ich nicht weis wie ich sonst auf S_OK hin testen soll. gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Wäre "GetLastError" ne Möglichkeit?
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Delphi-Quellcode:
dann mit dem
hr
Delphi-Quellcode:
Makro. Das Problem ist, dass sowohl
SUCCEEDED()
Delphi-Quellcode:
, als auch
S_OK
Delphi-Quellcode:
keinen Fehler indizieren, weshalb du immer
S_FALSE
Delphi-Quellcode:
erhälst. Du musst nach dem
true
Delphi-Quellcode:
Check nochmal genau prüfen, also:
SUCCEEDED()
Delphi-Quellcode:
if SUCCEEDED(hr) then
begin if (hr = S_OK) then // String sollte etwas beinhalten else if (hr = S_FALSE) then // String sollte nil sein else // nicht dokumentiert end; Zitat:
Delphi-Quellcode:
definiert ist als
STDMETHOD
Delphi-Quellcode:
, also als Funktion mit
#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
Delphi-Quellcode:
als Rückgabewert (nicht zu verwechseln mit
HRESULT
Delphi-Quellcode:
).
STDMETHOD_
|
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Werde das mal mit SUCCEEDED ausprobieren (nicht essen nur testen ) :) Die frage ist nur was mache ich mit
Delphi-Quellcode:
if (hr = S_OK) then
Denn wenn die URL <> NIL dann weis ich es nach dem Aufruf der Funktion was nutzt mir eine nochmalige gegen Prüfung? Also was soll ich da reinpacken // String sollte etwas beinhalten gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Habe es jetzt mal so gemacht..
Delphi-Quellcode:
Aber sehe keinerlei unterschiede zwischen
if IsUrl then
begin if DYDYoutubeFilter <> nil then begin hr := CoCreateInstance(CLSID_3DYDYoutubeSource, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, Source); if SUCCEEDED(hr) then begin Source.QueryInterface(IID_ISupportedSites, SupportedSites); // Version := SupportedSites.GetVersion; hr := SupportedSites.Test(PWideChar(MediaFile), false, url); if SUCCEEDED(hr) then begin if (hr = S_OK) then begin x := SupportedSites.GetCount; if x <> 0 then begin for IntI := 0 to x - 1 do Test := SupportedSites.GetName(IntI); end; end; end; end; end; end;
Delphi-Quellcode:
hr ist ja 0 also S_OK
hr := SupportedSites
eine nochmalige Abfrage von
Delphi-Quellcode:
ist für mich unverständlich den ich weis doch das hr = 0 ist.
if (hr = S_OK) then
Mit der erneuten abfrage ist das ergebnis gleich URL ist LEER obwohl ich nochmals gegenprüfe und hr = 0 ist siehe Pic. Hmmm... unverständlich gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Das Problem hier ist das Delphi und C++ unterschiedlicher Meinung sind wie
Result Parameter übergeben werden. Bin jetzt nicht an meinem Büro Rechner aber ich würde sagen wenn Du zb.
Delphi-Quellcode:
mal abänderst zu
function GetName(index: UINT): WideString; stdcall;
Delphi-Quellcode:
könnte es gehen.
procedure GetName(index : UINT; out Result : WideString); stdcall;
Eventuell auch die Reihenfolge der Parameter tauschen functionen in Interfaces die kein Result liefern sind sowieso..... @Eweis: Du kannst es mir auch Mailen dann schaue ich drüber. (nicht vor Montag) |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Nein das geht nicht.
Es muss
Delphi-Quellcode:
function GetName(index: UINT): PWideChar; stdcall;
sein. Das funktioniert ja auch nur die Rückgabe der URL nicht. Habe bald das Gefühl das in dem Filter einiges im argen ist. Der Programmierer hat eine riesen Support Seite mit Formular usw.. wenn man aber was schreibt dann kommt nix. Deshalb stehe ich auf den schlauch ;) Wenn ich das nicht klären kann werde ich den Support für den Filter einfach wieder entfernen. ;) Zitat:
PWideChar! Zitat:
gruss |
AW: C++ Delphi Übersetzung 3DYDYoutube Filter
Zitat:
Also in COM immer function(Parameter.. ; Out Result : type) : HRESULT; das ist der von Microsoft eigentlich gewünschte Weg. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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