Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ C++ Delphi Übersetzung 3DYDYoutube Filter (https://www.delphipraxis.net/198084-c-delphi-uebersetzung-3dydyoutube-filter.html)

EWeiss 2. Okt 2018 22:27


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:
  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;
Sollte eigentlich in Ordnung sein.
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 };
Die Infos sind recht spärlich und Antwort von ihm habe ich leider auch keine bekommen.

gruss

KodeZwerg 2. Okt 2018 22:46

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Das sollte ein Property darstellen des Typs Int.

EWeiss 2. Okt 2018 22:49

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414737)
Das sollte ein Property darstellen des Typs Int.

Versteh ich nicht. Umgesetzt?

gruss

KodeZwerg 2. Okt 2018 22:53

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Delphi-Quellcode:
  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;
edit
also kVersion muss etwas sein wo als wert ne 5 zurückkommt, vielleicht macht man das bei interface auch anders, per function oder so...

EWeiss 2. Okt 2018 23:01

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414740)
Delphi-Quellcode:
  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;

Heheheh.. Vielleicht.. JA! :)
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

KodeZwerg 2. Okt 2018 23:12

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:

EWeiss 2. Okt 2018 23:16

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

wenn es nun läuft scheints das ja gewesen zu sein
Nein das laufen des Video hat damit nichts zu tun das ist eine andere Sache.

gruss

EWeiss 3. Okt 2018 13:42

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Habe immer noch ein C++ Problem. :oops:

Code:
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;
}
Kann da bitte jemand bei der Übersetzung helfen? Danke

Habe es mal auf diese weise versucht.
Delphi-Quellcode:
  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;
URL ist immer leer. :wall:


gruss

KodeZwerg 3. Okt 2018 14:07

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Ich bin gerade privat eingebunden, aber falls es Dich interessieren sollte, hier entnehme ich mir viele Informationen dazu.

EWeiss 3. Okt 2018 14:15

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414784)
Ich bin gerade privat eingebunden, aber falls es Dich interessieren sollte, hier entnehme ich mir viele Informationen dazu.

Finde da nichts was mir bei meinem Problem helfen könnte. Trotzdem Danke. ;)
Na ja vielleicht ist @Zacherl die Tage online.

gruss

Zacherl 4. Okt 2018 23:56

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Habe leider auch nicht wirklich Ahnung, wie
Delphi-Quellcode:
BSTR*
definiert ist (die wäre wichtig), aber die Übersetzung als
Delphi-Quellcode:
out string
ist ziemlich sicher falsch (den Delphi String Typen kennt C++ nicht).

KodeZwerg 5. Okt 2018 00:07

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
WideString bzw PChar sollte ein BSTR darstellen falls das hilft.

EWeiss 5. Okt 2018 00:13

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414952)
WideString bzw PChar sollte ein BSTR darstellen falls das hilft.

Soweit bin ich auch schon das es Widestring ist.. (Wenn schon dann PWideChar aber auch schon versucht kommt nix bei rum)
Es scheint aber ein Pointer zu sein
Code:
BSTR*
Nun in dem Fall wäre es PWideString und das hab ich schon versucht es liefert keinen verwendbaren string zurück.

Hier ist irgend etwas noch unverständlich für mich also die Übersetzung.
Code:
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;
 }
bin mir nicht sicher ob das richtig ist!
Delphi-Quellcode:
 
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;
Source basierend auf IBaseFilter oder auf IFileSourceFilter.
Zitat:

ISupportedSites IID is {FF762ACC-13EC-463A-A29C-FD4B0CD3E019} (see SDK). You must query it from the filter instance. Example (C++):
Nun das SDK ist ja mein Problem ;) blicke da nicht wirklich durch.

gruss

KodeZwerg 5. Okt 2018 00:20

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?

EWeiss 5. Okt 2018 00:21

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414954)
Mir fehlt da gerade ein Testprojekt, versuche mal PWideChar anstelle PWideString.

Zitat:

Soweit bin ich auch schon das es Widestring ist.. (Wenn schon dann PWideChar aber auch schon versucht kommt nix bei rum)
Ich muss die filter instance über CoCreateInstance erstellen nur auf welcher Basis.

EDIT:
Und das ist auch fraglich..
Delphi-Quellcode:
SupportedSites := ISupportedSites(Source);
Zitat:

Was sagt Debugger zu URL?
Sagte ich das nicht schon ? Nichts String ist immer leer. ;)

Zitat:

Eventuell muss man noch mit SetLength() da was machen?
Nö die URL wird zurückgegeben..

gruss

Zacherl 5. Okt 2018 00:31

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von EWeiss (Beitrag 1414956)
Delphi-Quellcode:
SupportedSites := ISupportedSites(Source);

Bin wirklich kein Experte mit dem COM Kram, aber denke hier solltest du mit
Delphi-Quellcode:
QueryInterface()
bzw.
Delphi-Quellcode:
Supports()
arbeiten statt.

Ist der String tatsächlich valide, aber leer, oder
Delphi-Quellcode:
nil
? Und hast du jetzt
Delphi-Quellcode:
PWideChar
oder
Delphi-Quellcode:
var PWideChar
genommen? Wenn die Deklaration hier richtig ist:
Code:
typedef unsigned short wchar_t;
typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
sollte letzteres korrekt sein.

EWeiss 5. Okt 2018 00:38

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

aber denke hier solltest du mit QueryInterface() bzw. Supports() arbeiten statt.
Werde das mal versuchen Danke..
Zitat:

Und hast du jetzt PWideChar oder var PWideChar genommen? Wenn die Deklaration hier richtig ist:
PWideString kann es aber auch nochmal mit PWideChar angehen.

gruss

Zacherl 5. Okt 2018 00:39

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von EWeiss (Beitrag 1414958)
PWideString kann es aber auch nochmal mit PWideChar angehen.

Achso, ne wenn muss es
Delphi-Quellcode:
PWideChar
sein. Denke sogar eher
Delphi-Quellcode:
var PWideChar
der Typdefinition nach zu schließen.

KodeZwerg 5. Okt 2018 00:39

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von EWeiss (Beitrag 1414953)
Delphi-Quellcode:
       hr := SupportedSites.Test(PWideChar(MediaFile), false, POleStr(url));

ICh stocher hier auch nur im Dunkeln, so eventuell?

Zacherl 5. Okt 2018 00:40

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414960)
Zitat:

Zitat von EWeiss (Beitrag 1414953)
Delphi-Quellcode:
       hr := SupportedSites.Test(PWideChar(MediaFile), false, POleStr(url));

ICh stocher hier auch nur im Dunkeln, so eventuell?

Nene, das ist Murks :lol:

EWeiss 5. Okt 2018 00:42

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1414960)
Zitat:

Zitat von EWeiss (Beitrag 1414953)
Delphi-Quellcode:
       hr := SupportedSites.Test(PWideChar(MediaFile), false, POleStr(url));

ICh stocher hier auch nur im Dunkeln, so eventuell?

Danke!
Zitat:

Nene, das ist Murks
Könnte das mit dem OleStr nachher auch noch mal versuchen wenn PWideChar nichts bringt.
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:

Ist der String tatsächlich valide, aber leer, oder nil ?
Leer bzw. NIL

Zitat:

You must query it from the filter instance. Example (C++):
Code:
 if (FAILED(hr = source.CoCreateInstance(__uuidof(IYoutubeSource)))) {
      return VLC_EGENERIC;
Zitat:

solltest du mit QueryInterface()
Er erstellt den Source über CoCreateInstance.

Hmmm...

gruss

KodeZwerg 5. Okt 2018 00:49

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
[QUOTE=EWeiss;1414962]
Zitat:

Zitat von KodeZwerg (Beitrag 1414960)
Zitat:

Zitat von EWeiss (Beitrag 1414953)
Delphi-Quellcode:
       hr := OleCheck(SupportedSites.Test(PWideChar(MediaFile), false, url));

ICh stocher hier auch nur im Dunkeln, so eventuell? Bin Wiederholungstäter im Murksen ;)


EWeiss 5. Okt 2018 00:50

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Delphi-Quellcode:
 hr := OleCheck(SupportedSites.Test(PWideChar(MediaFile), false, url));

Nee ;)
Ich brauche kein OleCheck hr ist mein OleCheck!
Ist hr = 0 dann sollte normalerweise alles in Ordnung sein.

gruss

EWeiss 5. Okt 2018 02:30

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:
  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;
Die Url bei SupportedSites.Test ist immer noch Nil sei's drum.
So wie ich das hier verstehe..
Zitat:

When S_OK is returned, canonical_url will contain canonical page url, otherwise
it will not be changed
Wenn S_OK also die Rückgabe 0 ist dann müsste mir die URL einen wert zurück liefern, tut sie aber nicht.
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:
    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;
gruss

Rollo62 5. Okt 2018 11:31

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Habe leider auch nicht wirklich Ahnung, wie BSTR* definiert ist (die wäre wichtig),
Hat mich jetzt auch interessiert, was ich hier finde ist allerdings gruselig :shock:

Ist das wohl aktuell ?

Fritzew 5. Okt 2018 12:20

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Also BSTR ist WideString auf Delphi Seite.
Delphi-Quellcode:
function GetName(index: UINT): WideString; stdcall;
function Test(url: PWideChar; explicitly: BOOL; out canonical_url: WideString): HRESULT; stdcall;
wäre meines Wissens nach die richtige Übersetzung

Zacherl 5. Okt 2018 12:43

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von Rollo62 (Beitrag 1414996)
Zitat:

Habe leider auch nicht wirklich Ahnung, wie BSTR* definiert ist (die wäre wichtig),
Hat mich jetzt auch interessiert, was ich hier finde ist allerdings gruselig :shock:

Zitat:

Zitat von Fritzew (Beitrag 1415007)
Also BSTR ist WideString auf Delphi Seite.
Delphi-Quellcode:
function GetName(index: UINT): WideString; stdcall;
function Test(url: PWideChar; explicitly: BOOL; out canonical_url: WideString): HRESULT; stdcall;

Mhh, schwer zu sagen, was hier stimmt. Ich hatte ein paar Posts zuvor eine andere Definition gefunden. Das
Delphi-Quellcode:
WideString
kommt mir allerdings sehr komisch vor, da dies ein Delphi Typ mit Ref-Counter und allem drum und dran ist.

So oder so ist der Output Zeiger ja
Delphi-Quellcode:
nil
. Entsprechend der Dokumentation der Funktion ist das ja in Ordnung, falls
Delphi-Quellcode:
S_FALSE
zurückgeliefert wird. Jetzt kommt der Knackpunkt:
Zitat:

Zitat von MSDN
The constants S_OK and S_FALSE are both success codes

Entsprechend liefert das
Delphi-Quellcode:
SUCCEEDED()
Makro jeweils
Delphi-Quellcode:
true
zurück. Hier müsstest du also nachher noch explizit auf
Delphi-Quellcode:
S_OK
oder
Delphi-Quellcode:
S_FALSE
testen.

Fritzew 5. Okt 2018 13:11

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
http://docwiki.embarcadero.com/Libra...tem.WideString

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.

Zacherl 5. Okt 2018 13:17

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von Fritzew (Beitrag 1415020)

Dann hätten wir wohl auch hier jetzt die korrekte Übersetzung :thumb:

EWeiss 5. Okt 2018 14:28

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

EWeiss 5. Okt 2018 14:39

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Dann hätten wir wohl auch hier jetzt die korrekte Übersetzung
Nein ist definitiv PWideChar!

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

EWeiss 5. Okt 2018 17:35

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Entsprechend liefert das SUCCEEDED() Makro jeweils true zurück. Hier müsstest du also nachher noch explizit auf S_OK oder S_FALSE testen.
Ich weis jetzt nicht wie du das meinst.

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:
STDMETHOD(Test)(__in LPCWSTR url, __in BOOL explicitly, __out_opt BSTR* canonical_url) = 0;
Sieht mir nach procedure aus, wenn dem so ist wie soll ich dann auf S_OK\S_FALSE testen?
Ich habe es als Function ausgelegt da ich nicht weis wie ich sonst auf S_OK hin testen soll.

gruss

KodeZwerg 5. Okt 2018 17:45

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Wäre "GetLastError" ne Möglichkeit?

EWeiss 5. Okt 2018 17:47

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von KodeZwerg (Beitrag 1415042)
Wäre "GetLastError" ne Möglichkeit?

Nein.

gruss

Zacherl 5. Okt 2018 17:53

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von EWeiss (Beitrag 1415041)
Das tue ich doch.
Delphi-Quellcode:
hr := SupportedSites.Test(PWideChar(MediaFile), false, url);

Nee, du prüfst aber doch das
Delphi-Quellcode:
hr
dann mit dem
Delphi-Quellcode:
SUCCEEDED()
Makro. Das Problem ist, dass sowohl
Delphi-Quellcode:
S_OK
, als auch
Delphi-Quellcode:
S_FALSE
keinen Fehler indizieren, weshalb du immer
Delphi-Quellcode:
true
erhälst. Du musst nach dem
Delphi-Quellcode:
SUCCEEDED()
Check nochmal genau prüfen, also:
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:

Zitat von EWeiss (Beitrag 1415041)
Die frage die da noch wäre ist das nun eine Procedure oder eine Funktion!
Code:
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.

Das ist auch korrekt so, da
Delphi-Quellcode:
STDMETHOD
definiert ist als
Delphi-Quellcode:
#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
, also als Funktion mit
Delphi-Quellcode:
HRESULT
als Rückgabewert (nicht zu verwechseln mit
Delphi-Quellcode:
STDMETHOD_
).

EWeiss 5. Okt 2018 17:58

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Das ist auch korrekt so
Ahh wuste ich jetzt nicht dann ist es doch eine Function.. Danke schön.

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

EWeiss 5. Okt 2018 18:17

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Habe es jetzt mal so gemacht..

Delphi-Quellcode:
  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;
Aber sehe keinerlei unterschiede zwischen
Delphi-Quellcode:
hr := SupportedSites
hr ist ja 0 also S_OK

eine nochmalige Abfrage von
Delphi-Quellcode:
if (hr = S_OK) then
ist für mich unverständlich den ich weis doch das hr = 0 ist.

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

Fritzew 5. Okt 2018 20:04

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:
function GetName(index: UINT): WideString; stdcall;
mal abänderst zu
Delphi-Quellcode:
procedure GetName(index : UINT; out Result : WideString); stdcall;
könnte es gehen.
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)

EWeiss 5. Okt 2018 20:20

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:

functionen in Interfaces die kein Result liefern sind sowieso.....
Die hat doch eine Rückgabe ;)
PWideChar!

Zitat:

@Eweis: Du kannst es mir auch Mailen dann schaue ich drüber. (nicht vor Montag)
Das wird schwierig mit den ganzen Filtern die da dran hängen um das korrekt prüfen zu können.

gruss

Fritzew 5. Okt 2018 20:27

AW: C++ Delphi Übersetzung 3DYDYoutube Filter
 
Zitat:

Zitat von EWeiss (Beitrag 1415054)
Nein das geht nicht.

Zitat:

functionen in Interfaces die kein Result liefern sind sowieso.....
Die hat doch eine Rückgabe ;)
PWideChar!

gruss

Sollte nicht Result sondern HRESULT heißen. (Mein Fehler nicht geschaut vor dem abschicken :oops:)

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 02:37 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz