![]() |
AllocateHWnd C#
Meine Messagen werden nicht verarbeitet wenn ich diese
mit C# austauschen will. Funktioniert AllocateHWnd nicht in verbindung mit .NET? Es wird nichts weitergeleitet. gruss |
AW: AllocateHWnd C#
Wenn du ein paar mehr Informations-Krümel streust, könnte jemand vllt. sogar erraten was dein Problem ist.
Dann kann derjenige uns dein Problem erklären. Und dann... Ja dann könnten wir uns vllt. sogar eine Lösung überlegen. :-) Könnte aber auch schneller gehen, wenn du uns erklärst um welche Messages es geht. Wie sie erzeugt werden, übergeben und in C# abgefangen werden sollten. |
AW: AllocateHWnd C#
Wenn ich meinen renderstream start erstelle ich ein unsichtbares Window mit AllocateHWnd
Delphi-Quellcode:
Anschließend wird ein Timer erstellt
if BB_RenderHandle = 0 then
BB_RenderHandle := Classes.AllocateHWnd(BassBoxVis1.RenderProc);
Delphi-Quellcode:
Im Timer schicke ich jetzt ne PostMessage (MyTimerMessage)
if VisDataThread.VisChan <> 0 then
begin if (m_lId = 0) then // create High Resolution Timer use mmsystem m_lId := timeSetEvent(25, 300, @TimerProc, BB_RenderHandle , TIME_PERIODIC); end;
Delphi-Quellcode:
die dann wenn sie in der RenderProc empfangen wird die FFT Daten bearbeitet und an
procedure TimerProc(wTimerID: DWORD; Msg: DWORD;
dwUser: longint; dw1: longint; dw2: longint); stdcall; begin PostMessage(BB_RenderHandle, MyTimerMessage, dw1, dw2); end; das ParentWindow (HauptAnwendung) zurückgibt.
Delphi-Quellcode:
procedure RenderProc(var Msg: TMessage); message MyTimerMessage;
Das ganze spielt sich in einer DLL ab und wird dann an das jeweilige Fenster der Hauptanwendung zum rendern zurückgegeben. Klappt alles Super nur in .NET C# nicht. Egal wie oft der Timer abfeuert ich komme nicht in die Renderproc, sieht so aus als wenn in .NET die Anwendung die Message nicht weiterleitet. Hab gelesen das AllocateHWnd nicht Speichersicher sein soll.. Nur seltsam das es in VB, Delphi und C++ keine probleme verursacht. Die Proc ist nichts besonderes
Delphi-Quellcode:
Nu dann werde ich jetzt gerne warten ob du mit den Krümeln was anfangen kannst. ;)
procedure TBASSBoxVis.RenderProc(var Msg: TMessage);
begin if Msg.Msg = MyTimerMessage then if VisDataThread.RenderFromStream then begin // bla bla end; Msg.Result := DefWindowProc(BB_RenderHandle, Msg.Msg, Msg.WParam, Msg.LParam); end; gruss |
AW: AllocateHWnd C#
Du schickst eine Message an ein verstecktes Fenster und diese Nachricht willst du von anderen Plugins aus abfangen, die auch in deinem Prozess laufen, richtig?
Abgesehen davon, dass sich das für mich nach "von hinten, durch die Brust, ins Auge pieken" anhört. (Dafür hat man normalerweise Callbacks in seiner PlugIn API!) Ich habe hier keine Windows Box und könnte keinen eigenen Schnipsel ausprobieren, was ich aber hier gefunden habe sieht mir nach einem guten Ansatz an, um Nachrichten abzufangen, auch wenn man kein Fenster hat: ![]() Wenn du in C# ein Fenster hast, kannst du natürlich einfach WndProc überschreiben. Du hast übrigens nicht geschrieben, wie du das von C# aus angehst. Ich muss hier immer noch ziemlich rumraten. |
AW: AllocateHWnd C#
Was soll ich mit dem NET schnipseln, auch wenn es gut gemeint war, die bringen mich nicht weiter.
Ich will nichts anderes als das die Messagen zwischen den Fenstern ausgetauscht werden.. Das sollte ja wohl von Windows noch selbst geregelt werden können oder? Zitat:
die anderen von mir genannten Sprachen wo es funktioniert außeracht lassen. Sorry für so ein gewäsch habe ich nun wirklich keine zeit. Wenn sich das bei dir wie ins Auge pieken anhört ist das deine sache ist aber weder sachlich noch hilfreich. Nochmal zum mitschreiben es bestehen keinerlei probleme in verbindung mit meiner DLL und anderen sprachen abgesehen davon wie du das hier hinstellen willst, funktioniert dort alles. Also kann es nicht an der Programmierweise liegen sondern muss .NET spezifisch sein. Ich bin nicht der erste auch nicht der letzte der mit AllocateHWnd arbeitet (Ja und ich weiss das es Unsicher ist.) Mit deinem geschnipsel jedenfalls hat das nichts zu tun. Also verträgt sich ein AllocateHWnd Sprachübergreifen von Delphi nach C# oder nicht. Was anderes wollte ich nicht wissen dafür braucht man auch keinen Code um diese Frage beantworten zu können wenn man es denn weiss. solche Antworten sind auf jedenfall .. bla.. bla.. und Wichtigtuerei gruss |
AW: AllocateHWnd C#
Das Hauptproblem hierbei ist eigentlich dein wirkliches Problem herauszufinden.
Mein erster Satz war eine Gegenfrage. Zitat:
Wer immer hier mitliest muss raten. Als Programmierer hasst man es zu raten. Wir haben deinen Code nicht vor uns. Es gibt zig Varianten wie man deine vagen Andeutungen deuten kann. Und du hast immer noch nicht gezeigt, wie/ob du versucht hast die Nachricht in C# abzufangen. Oder kann es sein, dass du in C# das Ganze versendest (äquivalent zu dem Delphi-Code) und es kommt in deiner Delphi-DLL nicht an? Ernsthaft, versuche dich auf die andere Seite zu versetzen und gebe Infos, die ohne Telepathie hilfreich sind. |
AW: AllocateHWnd C#
Das Window an dem die Messagen gehen und empfangen werden sollen
ist ein UserControl das als Container für die Anzeige unterschiedlicher Visualisierungen Cover und ähnliches verwendet wird und auf ein DirectX basierten Window aufgesetzt ist. Ich denke mal das dieses von seiner beschaffenheit her nicht mit AllocateHWnd zurechtkommt. Verstehe nur nicht wo da problem liegt denn ein normales zeichnen und als Container für Winamp Plugins wie Milk2 zu verwenden stellt kein problem dar. Es geht hier um Mediaportal die meine Bibliothek verwenden welche aber noch nie richtig implementiert wurde so das ich das jetzt selbst in angriff genommen habe. Es geht nicht um Quelltext sondern um die Frage lassen sich messagen zwischen diesen beiden Fenstern? austauschen. UC <> WPF = Windows? Das es deshalb nicht geht? ![]() Habe mal die Classe hochgeladen. Zu groß um hier einzufügen.
Delphi-Quellcode:
BASSVIS_SetVisPort
Tut letztlich nichts anderes als das im meinem Wrapper erstellte OpenGL window als Parent in das UC zu setzen. Gleichzusetzen mit "SetParent" der Win32API function So wie es aussieht scheint aber gerade hier das problem zu liegen das dieses aufgesetzte GLWindow auf das UC die Messagen nicht weiterleitet warum auch immer. Mit allen anderen Sprachen funktioniert es. gruss |
AW: AllocateHWnd C#
Es will zum verzweifeln nicht..
Ich komme unter .NET (Wenn die meinen Wrapper verwenden) in meiner in Delphi geschriebenen DLL einfach nicht in die Renderproc hinein obwohl ich über einen Timer 100% die richtige Message schicke.
Delphi-Quellcode:
Warum funktioniert das nicht!
procedure TimerProc(wTimerID: DWORD; Msg: DWORD;
dwUser: longint; dw1: longint; dw2: longint); stdcall; begin PostMessage(BB_RenderHandle, MyTimerMessage, dw1, dw2); end; procedure TBassBoxVis.RenderProc(var Msg: TMessage); var ChanInfo: BASS_CHANNELINFO; i: integer; begin if Msg.Msg = MyTimerMessage then Jetzt habe ich mir die Mühe gemacht ein Threadsicheres AllocateHWnd einzubauen (DSiWin32/DSiAllocateHWnd) aber es will trotzdem nicht. Ich sehe nicht was da falsch sein soll.
Delphi-Quellcode:
Es muss doch möglich sein über das erstellte Window Messagen auszutauschen
BB_RenderHandle := DSiAllocateHWnd(BassBoxVis1.RenderProc);
if VisDataThread.VisChan <> 0 then begin if (m_lId = 0) then // create High Resolution Timer use mmsystem m_lId := timeSetEvent(25, 0, @TimerProc, BB_RenderHandle , TIME_PERIODIC); end; Von Delphi nach Delph geht es doch auch. gruss |
AW: AllocateHWnd C#
Ok hab das Problem gefunden..
Das geht nicht wenn ich meine DLL aus einer .NET Anwendung heraus starte. Funktioniert aber in allen anderen Sprachen.. VB, Delphi usw..
Delphi-Quellcode:
Wenn ich das Handle aber in meiner Classe in der auch die RenderProc definiert ist zuweise
function BASS_BASSBOXVIS_RenderStream(StreamHandle: DWORD): BOOL; stdcall;
begin BB_RenderHandle := DSiAllocateHWnd(BassBoxVis1.RenderProc); dann funktioniert es seltsamerweise überall.
Delphi-Quellcode:
Jetzt brat mir einer einen Storch... Woran liegt das?
constructor TBASSBoxVis.Create(AOwner: TComponent);
begin inherited; BB_MessageHandle := DSiAllocateHWnd(ProcMessage); VisDataThread := TVisDataThread.Create(DataReadyMsg, ShareMemPointer); BB_RenderHandle := DSiAllocateHWnd(RenderProc); end; gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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-2025 by Thomas Breitkreuz