AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

Ein Thema von huelke · begonnen am 7. Sep 2009 · letzter Beitrag vom 7. Sep 2009
Antwort Antwort
huelke

Registriert seit: 7. Sep 2009
Ort: Dortmund
4 Beiträge
 
#1

SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 01:45
Hallo Zusammen,

ich schreibe grade an einem Plugin für eine FremdanbieterSoftware.
Dieses Plugin muss als DLL bereitgestellt werden.
Nun ist es aber so das mein Prototyp einen API-Timer (mittels SetTimer) verwendet.
Da mein Plugin kein WindowHandle hat, und ich das auch zu Problemen führen könnte, habe ich eine kleine Hilfsklasse erstellt.
Diese holt sich ein WindowHandle und implementiert die WndProc Procedure, so dass sie auf WindowsMessages reagieren könnte.

Das Problem ist:
Mittels SendMessage lässt sich die WndProc funktion ordnungsgemäß ausführen,
SetTimer jedoch tut garnichts, sorgt also für keine WM_TIMER Message die dann meinen Code anstoßen würde.


Wo ist das Problem? Was mache ich falsch?

Hier mal der Code der Hilfsklasse:
Das "Kernel" Zeug könnt Ihr ignorieren - es dient nur zur kommunikation mit der Hauptklasse.

Delphi-Quellcode:
 TDllTimer= class(TObject)

  private
    FWndHandle : HWND;
    myKernel: IIPSKernel; // The Link to the Main Application (not Important for this Issue)

  public
    procedure WndProc(var Msg: TMessage);
    constructor Create(IKernel: IIPSKernel);
    destructor Destroy; override;
    property WindowHandle: HWND read FWndHandle;

  end;

implementation


constructor TDllTimer.Create(IKernel: IIPSKernel);
begin
  myKernel:=IKernel; // The Link to the Main Application (not Important for this Issue)
   
   // Get a Window Handle
  FWndHandle := AllocateHWnd(WndProc);

  // This Works:
  SendMessage(FWndHandle,WM_TIMER, 1,0);

  // This does not:
   SetTimer(FWndHandle, 1, 1000,nil);

end;



destructor TDllTimer.Destroy;

begin
  DeAllocateHWnd(FWndHandle);
  inherited Destroy;
end;



procedure TDllTimer.WndProc(var Msg: TMessage);
begin
  myKernel.LogMessage(KL_MESSAGE, 0, 'My Timer', 'Any EVENT' ); // Just for debugging
  if Msg.Msg = WM_TIMER then
    myKernel.LogMessage(KL_MESSAGE, 0, 'My Timer', 'TIMER EVENT' ); // Just for debugging

  Msg.Result := DefWindowProc(FWndHandle, Msg.Msg, Msg.wParam, Msg.lParam);

end;

Vielen Vielen Dank.
Bin noch nicht wirklich lang mit Delphi unterwegs - aber für dieses Plugin gings nicht anders!

MfG
Huelke
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 06:19
Hi,

wie startest du denn den Timer ? Bzw. wie wird der in dem Hauptprogramm aufgerufen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
huelke

Registriert seit: 7. Sep 2009
Ort: Dortmund
4 Beiträge
 
#3

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 16:11
@Matti: Danke für deine Antwort!

Hi ich starte das so in etwa (hab mehrere Möglichkeiten durch):

Delphi-Quellcode:
TMYPlugin.startTimer();
var
  myTimer : TDllTimer;

begin
  myTimer:=TDllTimer.create(fKernel); // Kernel Ignorieren;
end;
Vorher hatte ich die SetTimer Funktion nicht im Constructor der Klasse sondern habe es direkt in der Hauptklasse ausgeführt:

Delphi-Quellcode:
TMYPlugin.startTimer();
var
  myTimer : TDllTimer;

begin
  myTimer:=TDllTimer.create(fKernel); // Kernel Ignorieren;
  SetTimer(myTimer.WindowHandle, 1, 1000,nil);
end;
Ist aber gehopst wie gesprungen.

Danke für die Hilfe.

MfG Huelke
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 16:17
Hast du das mal versucht ?
http://entwickler-forum.de/showpost....61&postcount=2
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
huelke

Registriert seit: 7. Sep 2009
Ort: Dortmund
4 Beiträge
 
#5

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 16:48
Ja die Seite war quasi die Vorlage für meine Hilfsklasse.

Der einzige unterschied ist dabei, das der die SetTimer Funktion nicht im Konstruktor aufruft, sondern aus einer externen Funktion.
Das habe ich aber auch ausprobiert (siehe oben 2. Abschnitt) - leider mit dem selben effekt .

Das Merkwürdige ist halt, das die WM_TIMER Message bei meiner Hilfsklasse ankommt, wenn ich sie von hand (SendMessage) schicke,
mittels SetTimer aber nicht!

Die SetTimer funktion sollte doch eigentlich auch nichts anderes machen, ausser das der "Absender" der Message nicht das Modul selber sondern dann der WindowsTimerPool (oder was auch immer) ist...?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 17:13
Wenn du deine Nachricht mit PostMessage schickst, passiert vermutlich auch nichts. Dir fehlt die Nachrichtenschleife.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
huelke

Registriert seit: 7. Sep 2009
Ort: Dortmund
4 Beiträge
 
#7

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 18:06
Ah jetzt ja, SetTimer benutzt PostMessages ja?
Mmmh verdammt. Danke für den Tipp

Ich nehme an es gibt kein SetTimer Derivat das SendMessage benutzt?
Oder gibt es ne möglichkeit eine Nachrichtenschleife zu implementieren?

Danke

thx
Huelke
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: SetTimer in DLL - nicht aktiv? (Trotz AllocateHWnd)

  Alt 7. Sep 2009, 19:21
Das hängt nicht per se mit SendMessage zusammen. In SendMessage gibt es intern einen Spezialfall, falls sendender und empfangender Thread identisch sind; dann wird einfach nur die Fensterprozedur "ganz normal" aufgerufen.
Du kannst eine Nachrichtenschleife recht einfach implementieren, dazu brauchst du jedoch einen Thread, da sie ständig laufen muss. Wenn du jedoch zunächst keine Nachrichtenschleife hast, gibt es keinen Grund, den UI-Timer (d.h. SetTimer/KillTimer) zu verwenden. Du solltest einen neuen Thread starten und dort entweder mit Sleep den Timer simulieren oder aber einen Waitable Timer verwenden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:13 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