AGB  ·  Datenschutz  ·  Impressum  







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

AllocateHWnd C#

Ein Thema von EWeiss · begonnen am 7. Jul 2013 · letzter Beitrag vom 9. Jul 2013
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AllocateHWnd C#

  Alt 7. Jul 2013, 12:21
Meine Messagen werden nicht verarbeitet wenn ich diese
mit C# austauschen will.

Funktioniert AllocateHWnd nicht in verbindung mit .NET?

Es wird nichts weitergeleitet.

gruss
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

AW: AllocateHWnd C#

  Alt 7. Jul 2013, 17:23
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: AllocateHWnd C#

  Alt 7. Jul 2013, 17:51
Wenn ich meinen renderstream start erstelle ich ein unsichtbares Window mit AllocateHWnd
Delphi-Quellcode:
if BB_RenderHandle = 0 then
  BB_RenderHandle := Classes.AllocateHWnd(BassBoxVis1.RenderProc);
Anschließend wird ein Timer erstellt
Delphi-Quellcode:
  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;
Im Timer schicke ich jetzt ne PostMessage (MyTimerMessage)
Delphi-Quellcode:
procedure TimerProc(wTimerID: DWORD; Msg: DWORD;
                                     dwUser: longint;
                                     dw1: longint;
                                     dw2: longint); stdcall;
begin
  PostMessage(BB_RenderHandle, MyTimerMessage, dw1, dw2);

end;
die dann wenn sie in der RenderProc empfangen wird die FFT Daten bearbeitet und an
das ParentWindow (HauptAnwendung) zurückgibt.

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:
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;
Nu dann werde ich jetzt gerne warten ob du mit den Krümeln was anfangen kannst.

gruss

Geändert von EWeiss ( 7. Jul 2013 um 18:00 Uhr)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

AW: AllocateHWnd C#

  Alt 7. Jul 2013, 18:42
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:

http://stackoverflow.com/a/2061741/35443

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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: AllocateHWnd C#

  Alt 7. Jul 2013, 19:13
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:
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!)
Wenn du gelesen hättest was ich geschrieben habe solltest du auch nicht einfach
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

Geändert von EWeiss ( 7. Jul 2013 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#6

AW: AllocateHWnd C#

  Alt 7. Jul 2013, 20:18
Das Hauptproblem hierbei ist eigentlich dein wirkliches Problem herauszufinden.

Mein erster Satz war eine Gegenfrage.
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?
Darauf kann man mit Ja oder Nein antworten. Ist es also eher ein Ja oder eher ein Nein?

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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: AllocateHWnd C#

  Alt 8. Jul 2013, 09:54
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?
AllocateHWnd() (more specifically, MakeObjectInstance()) is not thread-safe

Habe mal die Classe hochgeladen.
Zu groß um hier einzufügen.

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

Geändert von EWeiss (11. Jul 2019 um 17:09 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: AllocateHWnd C#

  Alt 9. Jul 2013, 16:43
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:
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
Warum funktioniert das nicht!
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:
  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;
Es muss doch möglich sein über das erstellte Window Messagen auszutauschen
Von Delphi nach Delph geht es doch auch.

gruss

Geändert von EWeiss ( 9. Jul 2013 um 16:47 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: AllocateHWnd C#

  Alt 9. Jul 2013, 18:35
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:
function BASS_BASSBOXVIS_RenderStream(StreamHandle: DWORD): BOOL; stdcall;
begin
  BB_RenderHandle := DSiAllocateHWnd(BassBoxVis1.RenderProc);
Wenn ich das Handle aber in meiner Classe in der auch die RenderProc definiert ist zuweise
dann funktioniert es seltsamerweise überall.
Delphi-Quellcode:
constructor TBASSBoxVis.Create(AOwner: TComponent);

begin
   inherited;

  BB_MessageHandle := DSiAllocateHWnd(ProcMessage);
  VisDataThread := TVisDataThread.Create(DataReadyMsg, ShareMemPointer);

  BB_RenderHandle := DSiAllocateHWnd(RenderProc);

end;
Jetzt brat mir einer einen Storch... Woran liegt das?

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 03:36 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