Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   IInterface Delphi vs VSC (https://www.delphipraxis.net/193456-iinterface-delphi-vs-vsc.html)

EWeiss 2. Aug 2017 14:49

IInterface Delphi vs VSC
 
Delphi.
Delphi-Quellcode:
  TStreamInfo = record
    streamType: TStreamType;
    ppmt: PAMMEDIATYPE;
    pdwFlags: Cardinal;
    plcid: Cardinal;
    pdwGroup: Cardinal;
    ppszName: PWideChar;
    ppObject: IInterface;
    ppUnk: IInterface;
  end;
C++
Code:
struct TStreamInfo {
  TStreamType streamType;
  AM_MEDIA_TYPE ppmt;
  unsigned int pdwFlags;
  unsigned int plcid;
  unsigned int pdwGroup;
  wchar_t* ppszName;
  IUnknown **ppObject;
  IUnknown **ppUnk;
};
Bin mir jetzt nicht sicher ob die Übersetzung im Header korrekt ist.
C kennt kein IInterface so wie in Delphi oder aber ich finde sie einfach nicht.

gruss

himitsu 2. Aug 2017 15:27

AW: IInterface Delphi vs VSC
 
IUnknown kennt Delphi auch,
aber fast Egal, da es ein Nachfahre von IInterface ist.



Erstmal mußt du auf die Speicherausrichtung achten:
Alte Delphis richten Standardmäßig nach "maximal" 4 Byte aus und etwas Neuere nach 8 Byte.
Wie im C dort der Standard ist, weiß ich nicht.

Also entweder das gleiche Align des C-Compilers explizit für diesen Record oder die ganze Unit einstellen.
Delphi-Quellcode:
{$ALIGN ...}


Oder Packed-Records verwenden.
Auf Seite des C auch Packed oder im Delphi mit FüllBytes arbeiten.



Speichergrößen:
In C++ sind ENUMs/SETs gern so groß wie ein INT
und in Delphi so klein wie möglich (meistens Byte und dann Word, LongWord oder UInt64).
Delphi-Quellcode:
{$MINENUMSIZE ...}

EWeiss 2. Aug 2017 15:35

AW: IInterface Delphi vs VSC
 
es ging mir um die beiden Einträge.

Code:
  IUnknown **ppObject;
  IUnknown **ppUnk;
ob diese gleichzusetzen sind mit IInterface.
Wenn nicht ist mein Header definitiv falsch übersetzt.

gruss

TiGü 2. Aug 2017 16:09

AW: IInterface Delphi vs VSC
 
Ja!

EWeiss 2. Aug 2017 16:14

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von TiGü (Beitrag 1377941)
Ja!

Danke!

gruss

himitsu 2. Aug 2017 16:16

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von himitsu (Beitrag 1377930)
IUnknown kennt Delphi auch,
aber fast Egal, da es ein Nachfahre von IInterface ist.

hier steht nichts

EWeiss 2. Aug 2017 17:06

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von himitsu (Beitrag 1377943)
Zitat:

Zitat von himitsu (Beitrag 1377930)
IUnknown kennt Delphi auch,
aber fast Egal, da es ein Nachfahre von IInterface ist.

hier steht nichts

Ja habe ich gelesen Danke dir.
War mir nur nicht sicher ob du damit das gleiche gemeint hast.

Da steht doch was spätestens dann wenn man eine Quote daraus macht ;) LOL

gruss

himitsu 2. Aug 2017 18:37

AW: IInterface Delphi vs VSC
 
Zitat aus der System.pas
Zitat:

Delphi-Quellcode:
type
  IUnknown = IInterface;

Vom Typ her ist es prizipiell das Selbe, in Delphi.
http://docwiki.embarcadero.com/RADSt...und_IInterface

EWeiss 2. Aug 2017 18:41

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von himitsu (Beitrag 1377959)
Zitat aus der System.pas
Zitat:

Delphi-Quellcode:
type
  IUnknown = IInterface;

Hatte vorhin wohl mehr an IDispatch gedacht.
Von der Speicherverwaltung her das Gleiche, außer dass man quasi virtuelle Methoden aufrufen kann, also wenn man das Interface verwendet.
(IDispatch in einem Variant\OleVariant)

Die frage ist nur wird das IUnknown auch initialisiert VSC seite.
So wie das bei IInterface in Delphi ist.

also.
Ich habe diese Funktionen in der art in meinem Header nicht.
Code:
 virtual HRESULT __stdcall QueryInterface(const GUID &IID, void **Obj)
 {
     return TInterfacedObject::QueryInterface(IID, (void *)Obj);
 
 
 virtual ULONG __stdcall AddRef()
 { 
     return TInterfacedObject::_AddRef();
 } 
 
 // ...
 virtual ULONG __stdcall Release()
 { 
     return TInterfacedObject::_Release();
 }
Wird das in VSC automatisch gemacht wenn ich IUnknown als DatenTyp übergebe?

gruss

himitsu 2. Aug 2017 18:53

AW: IInterface Delphi vs VSC
 
Das ist im IInterface drin.

Bzw. dein Code gehört nicht zum Interface, sondern zur Implementation und da ist es unter Anderem in TInterfacedObject enthalten.

EWeiss 2. Aug 2017 19:00

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von himitsu (Beitrag 1377961)
Das ist im IInterface drin.

Bzw. dein Code gehört nicht zum Interface, sondern zur Implementation und da ist es unter Anderem in TInterfacedObject enthalten.

Ok Danke ;)

gruss

himitsu 2. Aug 2017 19:06

AW: IInterface Delphi vs VSC
 
In Windows (C) können Interfaces scheinbar auch ohne, aber Delphi geht davon aus, dass Interfaces immer mindestens IInterface implementieren. (es wird halt für die automatische Speicherverwaltung verwendet)

Zacherl 2. Aug 2017 21:30

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von himitsu (Beitrag 1377963)
In Windows (C) können Interfaces scheinbar auch ohne, aber Delphi geht davon aus, dass Interfaces immer mindestens IInterface implementieren. (es wird halt für die automatische Speicherverwaltung verwendet)

Genau, C++ macht keine konkrete Unterscheidung zwischen Klasse und Interface (wie es bei z.b. Delphi oder Java der Fall ist). C++ Interfaces sind einfach ganz normale Klassen, die ausschließlich virtuelle Methoden besitzt. Will man COM-kompatibel sein, muss man aber zwingend
Delphi-Quellcode:
_AddRef
,
Delphi-Quellcode:
_Release
und
Delphi-Quellcode:
QueryInterface
bereitstellen.

Zu beachten ist, dass es unter C++ KEINE automatische Speicherverwaltung gibt. Sprich:
Delphi-Quellcode:
_AddRef
und
Delphi-Quellcode:
_Release
muss manuell aufgerufen werden (oder man verwendet den ComPtr). Aber das sollte bei dir keine Probleme machen, da die Implementierung ja in Delphi ist.

EWeiss 2. Aug 2017 23:32

AW: IInterface Delphi vs VSC
 
Zitat:

Aber das sollte bei dir keine Probleme machen, da die Implementierung ja in Delphi ist.
also brauch ich _AddRef und Konsorte in C++ nicht zu definieren.
Darauf wollte ich hinaus ;)

gruss

himitsu 3. Aug 2017 09:16

AW: IInterface Delphi vs VSC
 
Wenn du es als COM-Interface mit Delphi teilen willst, dann sollte es mit rein. (falls es nicht schon aus einem Vorfahren verwerbt wird)

Uwe Raabe 3. Aug 2017 10:09

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von EWeiss (Beitrag 1377969)
also brauch ich _AddRef und Konsorte in C++ nicht zu definieren.

Ich kenne jetzt den ganzen Zusammenhang nicht, aber wenn das Interface von C++ aus verwendet werden soll, dann müssen diese Methoden nicht nur definiert, sondern auch aufgerufen werden. Andernfalls könnte es passieren, daß die darunter liegende Instanz zu früh freigegeben wird.

EWeiss 3. Aug 2017 10:18

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1377981)
Zitat:

Zitat von EWeiss (Beitrag 1377969)
also brauch ich _AddRef und Konsorte in C++ nicht zu definieren.

Ich kenne jetzt den ganzen Zusammenhang nicht, aber wenn das Interface von C++ aus verwendet werden soll, dann müssen diese Methoden nicht nur definiert, sondern auch aufgerufen werden. Andernfalls könnte es passieren, daß die darunter liegende Instanz zu früh freigegeben wird.

Code:
struct TStreamInfo {
   TStreamType streamType;
   AM_MEDIA_TYPE ppmt;
   unsigned int pdwFlags;
   unsigned int plcid;
   unsigned int pdwGroup;
   wchar_t* ppszName;
   IUnknown **ppObject;
   IUnknown **ppUnk;
 };
IUnknown wird von Delphi zurück gegeben.

Code:
BOOL KVIDEOPLAYERDEF(KVideo_GetStreamInfo)(TStreamType StreamType, DWORD index, TStreamInfo OUT StreamInfo);
// Gets informatio for the specified stream
// ( parameter )
//  - StreamType : type of stream (stAudio, stVideo, stMiscellaneous)
//  - index : number of rank (first stream = 0)
//  - StreamInfo : pointer to a TStreamInfo variable
// ( result
//  - true on success, false on failure
gruss

Uwe Raabe 3. Aug 2017 10:24

AW: IInterface Delphi vs VSC
 
Die Frage ist: was machst du mit den beiden IUnknown-Feldern? Solange du die nicht verwendest, sollte es wohl egal sein.

EWeiss 3. Aug 2017 10:39

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1377985)
Die Frage ist: was machst du mit den beiden IUnknown-Feldern? Solange du die nicht verwendest, sollte es wohl egal sein.

Ich lese davon die Daten ein die von Delphi zurückgegeben werden.
Und das würde ich später zum vergleich auch in C++ tun.

Delphi-Quellcode:
    for i := 0 to aMediaProperty.NumVideoStream - 1 do
    begin
      KVideo_GetStreamInfo(stVideo, i, StreamInfo);
      menu := TMenuItem.Create(Self);
      menu.Caption := StreamInfo.ppszName;
      menu.RadioItem := true;
      if i = 0 then
        menu.Checked := true;
      menu.Tag := i;
      menu.OnClick := menuVideoStreamClick;
      menuSelectVideo.Add(menu);
    end;
Code:
   IUnknown **ppObject;
   IUnknown **ppUnk;
werden dabei aber nicht direkt angesprochen.

gruss

Uwe Raabe 3. Aug 2017 10:45

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von EWeiss (Beitrag 1377994)
Code:
   IUnknown **ppObject;
   IUnknown **ppUnk;
werden dabei aber nicht direkt angesprochen.

Ich denke, dann kannst du das so lassen.

EWeiss 3. Aug 2017 10:55

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1377997)
Zitat:

Zitat von EWeiss (Beitrag 1377994)
Code:
   IUnknown **ppObject;
   IUnknown **ppUnk;
werden dabei aber nicht direkt angesprochen.

Ich denke, dann kannst du das so lassen.

OK dann ist das geklärt.
Danke.

gruss

EWeiss 9. Aug 2017 23:03

AW: IInterface Delphi vs VSC
 
irgendwie will das immer noch nicht.

Code:
BOOL KVIDEOPLAYERDEF(KVideo_GetStreamInfo)(TStreamType StreamType, DWORD index, TStreamInfo OUT StreamInfo);
Die Rückgabe von..
Code:
struct TStreamInfo {
    TStreamType streamType;
    AM_MEDIA_TYPE ppmt;
    unsigned int pdwFlags;
    unsigned int plcid;
    unsigned int pdwGroup;
    wchar_t* ppszName;
    IUnknown **ppObject;
    IUnknown **ppUnk;
  };
typedef TStreamInfo* pStreamInfo;
ist NULL

Hmmm...
Ob das mit den Interface doch nicht stimmt?

gruss

Zacherl 10. Aug 2017 00:05

AW: IInterface Delphi vs VSC
 
Da prüft aber auch jemand seine eigenen Rückgabewerte nicht :warn: :-D Ist der Funktionsaufruf am Ende auf Seite der DLL einfach schon nicht erfolgreich?

Ansonsten:
Als was ist
Delphi-Quellcode:
OUT
definiert? Macro auf
Delphi-Quellcode:
*
?

EWeiss 10. Aug 2017 00:15

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von Zacherl (Beitrag 1378456)
Da prüft aber auch jemand seine eigenen Rückgabewerte nicht :warn: :-D Ist der Funktionsaufruf am Ende auf Seite der DLL einfach schon nicht erfolgreich?

Ansonsten:
Als was ist
Delphi-Quellcode:
OUT
definiert? Macro auf
Delphi-Quellcode:
*
?

OUT ist definiert
Delphi-Quellcode:
function KVideo_GetStreamInfo(StreamType: TStreamType; index: Cardinal;
      out StreamInfo: TStreamInfo): BOOL; stdcall;
StreamInfo hat alle werte die zur verfügung stehen.
sie kommen aber in C++ nicht an.

[DELPHI]Macro auf *
verstehe ich jetzt nicht.

Wenn ich die Daten analysiere sind sie vorhanden ich kann sie sehen als ToolTip
wenn ich aber durch bin zeigt der ToolTip nix mehr. (Delphi)

gruss

Zacherl 10. Aug 2017 00:17

AW: IInterface Delphi vs VSC
 
In C++ gibt es sowas wie
Delphi-Quellcode:
var
oder
Delphi-Quellcode:
out
nicht. Hab grade nochmal nachgeschaut: Das
Delphi-Quellcode:
OUT
Macro aus der Windows.h dient lediglich der Dokumentation und hat im Grunde aber wirklich keine Auswirkung. Du musst alle
Delphi-Quellcode:
var
und
Delphi-Quellcode:
out
Parameter in C++ als Pointer umsetzen, also statt
Delphi-Quellcode:
TStreamInfo
muss es
Delphi-Quellcode:
pStreamInfo
bzw.
Delphi-Quellcode:
TStreamInfo*
sein:

Delphi-Quellcode:
BOOL KVIDEOPLAYERDEF(KVideo_GetStreamInfo)(TStreamType StreamType, DWORD index, TStreamInfo* StreamInfo);


Der Aufruf entsprechend:
Delphi-Quellcode:
TStreamInfo streamInfo;
KVideo_GetStreamInfo(streamType, index, &streamInfo);

EWeiss 10. Aug 2017 00:27

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von Zacherl (Beitrag 1378459)
In C++ gibt es sowas wie
Delphi-Quellcode:
var
oder
Delphi-Quellcode:
out
nicht. Hab grade nochmal nachgeschaut: Das
Delphi-Quellcode:
OUT
Macro aus der Windows.h dient lediglich der Dokumentation und hat im Grunde aber wirklich keine Auswirkung. Du musst alle
Delphi-Quellcode:
var
und
Delphi-Quellcode:
out
Parameter in C++ als Pointer umsetzen, also statt
Delphi-Quellcode:
TStreamInfo
muss es
Delphi-Quellcode:
pStreamInfo
bzw.
Delphi-Quellcode:
TStreamInfo*
sein:

Delphi-Quellcode:
BOOL KVIDEOPLAYERDEF(KVideo_GetStreamInfo)(TStreamType StreamType, DWORD index, TStreamInfo* StreamInfo);


Der Aufruf entsprechend:
Delphi-Quellcode:
TStreamInfo streamInfo;
KVideo_GetStreamInfo(streamType, index, &streamInfo);

Danke werde es mal versuchen.
Seltsam aber das es hier funktioniert auch mit OUT.

Code:
BOOL KVIDEOPLAYERDEF(KVideo_GetMediaProperty)(TMediaProperty* OUT MediaProperty);
Ich denke aber das liegt wohl eher am Pointer *

gruss

Zacherl 10. Aug 2017 00:33

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von EWeiss (Beitrag 1378460)
Ich denke aber das liegt wohl eher am Pointer *

Genau, hier hast du ja den Pointer. Das
Delphi-Quellcode:
OUT
macht wirklich absolut gar nichts :-D

EWeiss 10. Aug 2017 00:35

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von Zacherl (Beitrag 1378461)
Zitat:

Zitat von EWeiss (Beitrag 1378460)
Ich denke aber das liegt wohl eher am Pointer *

Genau, hier hast du ja den Pointer. Das
Delphi-Quellcode:
OUT
macht wirklich absolut gar nichts :-D

Danke funktioniert mit deiner Hilfe also alles nur Makulatur mit dem OUT und IN zur eigenen Kontrolle vielleicht. LOL

gruss

EWeiss 10. Aug 2017 00:37

AW: IInterface Delphi vs VSC
 
sollte ich das in Delphi
Delphi-Quellcode:
    ppObject: IInterface;
    ppUnk: IInterface;
mit
Delphi-Quellcode:
    ppObject: IUnknown;
    ppUnk: IUnknown;
ersetzen oder so belassen.
Weil auch in DirectShow is es als IUnknown definiert.

gruss

TiGü 10. Aug 2017 09:25

AW: IInterface Delphi vs VSC
 
Zitat:

Zitat von EWeiss (Beitrag 1378463)
sollte ich das in Delphi
Delphi-Quellcode:
    ppObject: IInterface;
    ppUnk: IInterface;
mit
Delphi-Quellcode:
    ppObject: IUnknown;
    ppUnk: IUnknown;
ersetzen oder so belassen.
Weil auch in DirectShow is es als IUnknown definiert.

Das ist total egal.

EWeiss 10. Aug 2017 13:37

AW: IInterface Delphi vs VSC
 
Danke ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

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