AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Events von Delphi to C++

Ein Thema von EWeiss · begonnen am 4. Aug 2017 · letzter Beitrag vom 5. Aug 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Events von Delphi to C++

  Alt 4. Aug 2017, 23:48
Sorry ja ich nerve zur zeit.

Die Events in Delphi.
Delphi-Quellcode:
  TPlayerEvent = (PlayEnded, ErrorEnded);
  CBEventNotice = procedure(Event: TPlayerEvent); stdcall;

  KVideo_Initialize: function(MediaWindow: HWND; EventNoticeFunc: CBEventNotice): BOOL; stdcall;
funktioniert von Delphi zu Delphi ohne nennenswerte Probleme.

Jetzt in C++ definiert.
Code:
enum TPlayerEvent {
  PlayEnded,
  ErrorEnded
};
typedef void ( * CBEventNotice )( TPlayerEvent );

BOOL KVIDEOPLAYERDEF(KVideo_Initialize)(HWND MediaWindow, CBEventNotice events);
Die Funktion welche die Events empfangen soll.
Code:
void OnPlayerEvent(TPlayerEvent event)
{
    if (event == PlayEnded)
    {
        KillTimer(MovieHandle, MOVIE_TIMER);
    }
}
Mein Problem es kommen nie welche an.
Was ist da falsch?

Habe es schon auf diese weise versucht geht aber auch nicht.
Code:
void _stdcall OnPlayerEvent(TPlayerEvent event)
{
    if (event == PlayEnded)
    {
        KillTimer(MovieHandle, MOVIE_TIMER);
    }
}
gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Events von Delphi to C++

  Alt 5. Aug 2017, 02:42
Also wenn du es in Delphi mit stdcall deklariert hast, musst du das in C++ auf jeden Fall schonmal auch verwenden. Auch beim Typedef!

Jetzt ist die Frage:
Wird das Event wirklich nicht ausgelöst, oder stimmt nur der "Event Code" nicht? Lass mal eine MessageBox vor der Auswertung von event anzeigen.

Enums in C++ sind standardmäßig 4-Bytes groß, während sie bei Delphi dynamisch skalieren.

Du kannst jetzt entweder in Delphi das Enum per Compiler-Switch auf 4-Bytes vergrößern (oder als letztes Element ein FORCE_DWORD = MAXINT hinzufügen), oder du verkleinerst die Enum-Größe entsprechend im C++ Code. Hier würde ich dir generell zu typisierten Enums raten (Delphi Enums sind auch typesafe):
Code:
enum class PlayerEvent : std::uint8_t // #include <cstdint>
{
    PlayEnded,
    ErrorEnded
};
Statt uint8_t sind je nach Anzahl der Elemente dann auch andere Typen wie z.b. uint16_t , etc. Möglich.

Deine Abfrage sieht mit typisierten Enums dann so aus:
Code:
void _stdcall OnPlayerEvent(TPlayerEvent event)
{
    if (event == PlayerEvent::PlayEnded)
    {
        KillTimer(MovieHandle, MOVIE_TIMER);
    }
}
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 5. Aug 2017 um 02:45 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Events von Delphi to C++

  Alt 5. Aug 2017, 02:50
Das Problem ist das wenn ich einen break Point setze in

Code:
 if (event = PlayEnded)
Ich niemals da rein komme wenn der Film endet.
In Delphi immer.

Daher bin ich mir nicht sicher ob meine Funktion bzw. das Event richtig ist.
Also das hier

Code:
typedef void ( * CBEventNotice )( TPlayerEvent );
gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Events von Delphi to C++

  Alt 5. Aug 2017, 03:04
Bekomme dann 2 Fehler
Code:
Fehler (aktiv)   E0167   Das Argument vom Typ ""void (__stdcall *)(TPlayerEvent event)"" ist mit dem Parameter vom Typ ""TPlayerEvent"" inkompatibel.

Fehler   C2664   "BOOL KVideo_Initialize(HWND,TPlayerEvent)" : Konvertierung von Argument 2 von "void (__cdecl *)(TPlayerEvent)" in "TPlayerEvent" nicht möglich
cpp..
Code:
void _stdcall OnPlayerEvent(TPlayerEvent event)
{
    if (event == TPlayerEvent::PlayEnded)
    {
        KillTimer(MovieHandle, MOVIE_TIMER);
    }
}

if (KVideo_Initialize(MovieHandle, OnPlayerEvent))
h..
Code:
enum class TPlayerEvent : std::uint8_t {
  PlayEnded,
  ErrorEnded
};

typedef void ( * CBEventNotice )(TPlayerEvent);

BOOL KVIDEOPLAYERDEF(KVideo_Initialize)(HWND MediaWindow, TPlayerEvent callback);
EDIT:
Ok habe das geändert.
Jetzt lässt es sich wieder kompilieren.
Code:
BOOL KVIDEOPLAYERDEF(KVideo_Initialize)(HWND MediaWindow, CBEventNotice event);
Aber es wird immer noch kein Event ausgelöst. Hmmm...
Das kann ich nicht ändern.
Code:
typedef void _stdcall( * CBEventNotice )(TPlayerEvent);
produziert den Fehler.

Zitat:
Fehler (aktiv) E0651 Auf eine Aufrufkonvention darf kein geschachtelter Deklarator folgen.
Fehler C2059 Syntaxfehler: "("
Fehler C2061 Syntaxfehler: Bezeichner "CBEventNotice"
Fehler C2660 "KVideo_Initialize": Funktion akzeptiert keine 2 Argumente
gruss

Geändert von EWeiss ( 5. Aug 2017 um 03:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Events von Delphi to C++

  Alt 5. Aug 2017, 03:43
Code:
typedef void _stdcall( * CBEventNotice )(TPlayerEvent);
produziert den Fehler.

Zitat:
Fehler (aktiv) E0651 Auf eine Aufrufkonvention darf kein geschachtelter Deklarator folgen.
Fehler C2059 Syntaxfehler: "("
Fehler C2061 Syntaxfehler: Bezeichner "CBEventNotice"
Fehler C2660 "KVideo_Initialize": Funktion akzeptiert keine 2 Argumente
Da ist deine Syntax falsch (die ist aber zugegebenermaßen auch echt sehr eigen an dieser Stelle ). So muss es heißen:
Code:
typedef void (__stdcall *CBEventNotice )(TPlayerEvent);
_stdcall mit einem "_" wird übrigens nur bei MSVC funktionieren, deshalb am besten immer 2 Unterstriche verwenden.

Edit:
Und ich glaube bei if (KVideo_Initialize(MovieHandle, OnPlayerEvent)) fehlt noch der Adress-Operator, also if (KVideo_Initialize(MovieHandle, &OnPlayerEvent)) (wobei das glaube ich bei den meisten Compilern sogar optional ist).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 5. Aug 2017 um 03:48 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Events von Delphi to C++

  Alt 5. Aug 2017, 03:56
Zitat:
die ist aber zugegebenermaßen auch echt sehr eigen an dieser Stelle
Er wurde von einem Übersetzung Tool so bereitgestellt (Nun gut ich halte nicht besonders viel davon)
Habe noch keins gesehen das wirklich gut funktioniert.
Das beste Tool ist immer noch der Kopf selbst (oder andere Köpfe) LOL.

Zitat:
fehlt noch der Adress-Operator
Ja nach deinen Änderungen.
Vorher habe ich den nicht setzen können.

Habe jetzt alles so gemacht wie du mir es gesagt hast.
Danke für deine Zeit und Hilfe.

aber leider wird immer noch kein Event ausgelöst.
Da ich davon ausgehe das deine Änderungen richtig sind kann es nur noch an meiner DLL liegen.

Muss diese nochmal prüfen.
Was anderes fällt mir sonst nicht ein

gruss

Geändert von EWeiss ( 5. Aug 2017 um 03:59 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Events von Delphi to C++

  Alt 5. Aug 2017, 04:42
OK es funktioniert nun.

Ich habe es mal mit der Delphi64Bit Anwendung getestet da war das gleiche Problem.
Das Event wurde nicht ausgelöst.

Habe mir dann nochmal die Dateitypen angesehen die verwendet werden musste dann feststellen das die Events in DirectShow wParam, LParam mit LongInt definiert waren.
Das war natürlich falsch deshalb ging es nicht.
Nach der Änderung auf LONG_PTR (INT64) funktioniert das ganze jetzt.

Da die Zeitmessung und die Positionen im Film ebenfalls mit INT64 definiert sind muss das natürlich gleich sein.
Andernfalls werden die Events nicht ausgelöst.

Danke für die richtigen Funktionen ohne die würde es immer noch nicht gehen.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 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