![]() |
Events von Delphi to C++
Sorry ja ich nerve zur zeit. ;)
Die Events in Delphi.
Delphi-Quellcode:
funktioniert von Delphi zu Delphi ohne nennenswerte Probleme.
TPlayerEvent = (PlayEnded, ErrorEnded);
CBEventNotice = procedure(Event: TPlayerEvent); stdcall; KVideo_Initialize: function(MediaWindow: HWND; EventNoticeFunc: CBEventNotice): BOOL; stdcall; Jetzt in C++ definiert.
Code:
Die Funktion welche die Events empfangen soll.
enum TPlayerEvent {
PlayEnded, ErrorEnded }; typedef void ( * CBEventNotice )( TPlayerEvent ); BOOL KVIDEOPLAYERDEF(KVideo_Initialize)(HWND MediaWindow, CBEventNotice events);
Code:
Mein Problem es kommen nie welche an.
void OnPlayerEvent(TPlayerEvent event)
{ if (event == PlayEnded) { KillTimer(MovieHandle, MOVIE_TIMER); } } Was ist da falsch? Habe es schon auf diese weise versucht geht aber auch nicht.
Code:
gruss
void _stdcall OnPlayerEvent(TPlayerEvent event)
{ if (event == PlayEnded) { KillTimer(MovieHandle, MOVIE_TIMER); } } |
AW: Events von Delphi to C++
Also wenn du es in Delphi mit
Delphi-Quellcode:
deklariert hast, musst du das in C++ auf jeden Fall schonmal auch verwenden. Auch beim Typedef!
stdcall
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
Delphi-Quellcode:
anzeigen.
event
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
Delphi-Quellcode:
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):
FORCE_DWORD = MAXINT
Code:
Statt
enum class PlayerEvent : std::uint8_t // #include <cstdint>
{ PlayEnded, ErrorEnded };
Delphi-Quellcode:
sind je nach Anzahl der Elemente dann auch andere Typen wie z.b.
uint8_t
Delphi-Quellcode:
, etc. Möglich.
uint16_t
Deine Abfrage sieht mit typisierten Enums dann so aus:
Code:
void _stdcall OnPlayerEvent(TPlayerEvent event)
{ if (event == PlayerEvent::PlayEnded) { KillTimer(MovieHandle, MOVIE_TIMER); } } |
AW: Events von Delphi to C++
Das Problem ist das wenn ich einen break Point setze in
Code:
Ich niemals da rein komme wenn der Film endet.
if (event = PlayEnded)
In Delphi immer. Daher bin ich mir nicht sicher ob meine Funktion bzw. das Event richtig ist. Also das hier
Code:
gruss
typedef void ( * CBEventNotice )( TPlayerEvent );
|
AW: Events von Delphi to C++
Bekomme dann 2 Fehler
Code:
cpp..
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
Code:
h..
void _stdcall OnPlayerEvent(TPlayerEvent event)
{ if (event == TPlayerEvent::PlayEnded) { KillTimer(MovieHandle, MOVIE_TIMER); } } if (KVideo_Initialize(MovieHandle, OnPlayerEvent))
Code:
EDIT:
enum class TPlayerEvent : std::uint8_t {
PlayEnded, ErrorEnded }; typedef void ( * CBEventNotice )(TPlayerEvent); BOOL KVIDEOPLAYERDEF(KVideo_Initialize)(HWND MediaWindow, TPlayerEvent callback); Ok habe das geändert. Jetzt lässt es sich wieder kompilieren.
Code:
Aber es wird immer noch kein Event ausgelöst. Hmmm...
BOOL KVIDEOPLAYERDEF(KVideo_Initialize)(HWND MediaWindow, CBEventNotice event);
Das kann ich nicht ändern.
Code:
produziert den Fehler.
typedef void _stdcall( * CBEventNotice )(TPlayerEvent);
Zitat:
|
AW: Events von Delphi to C++
Zitat:
Code:
typedef void (__stdcall *CBEventNotice )(TPlayerEvent);
Delphi-Quellcode:
mit einem "_" wird übrigens nur bei MSVC funktionieren, deshalb am besten immer 2 Unterstriche verwenden.
_stdcall
Edit: Und ich glaube bei
Delphi-Quellcode:
fehlt noch der Adress-Operator, also
if (KVideo_Initialize(MovieHandle, OnPlayerEvent))
Delphi-Quellcode:
(wobei das glaube ich bei den meisten Compilern sogar optional ist).
if (KVideo_Initialize(MovieHandle, &OnPlayerEvent))
|
AW: Events von Delphi to C++
Zitat:
Habe noch keins gesehen das wirklich gut funktioniert. Das beste Tool ist immer noch der Kopf selbst (oder andere Köpfe) LOL. Zitat:
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 |
AW: Events von Delphi to C++
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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