AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie stelle ich sicher dass ich nichts von VCL verwende
Thema durchsuchen
Ansicht
Themen-Optionen

Wie stelle ich sicher dass ich nichts von VCL verwende

Ein Thema von Viktorii · begonnen am 31. Okt 2008 · letzter Beitrag vom 5. Nov 2008
Antwort Antwort
Seite 2 von 2     12   
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#11

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 10:08
Zitat von Luckie:
Hat dein Thread ein Fenster und eine Nachrichtenschleife?
Da bin ich jetzt etwas überfragt. Ich habe ein Fenster Handle...

Die Objekt Variable meines Notifyer ist in der DLL global definiert. Das Notifyer Objekt wird in einer "init" Funktion (welche immer als erstes aufgerufen werden muss wenn man andere Funktionen der DLL verwenden möchte) erstellt.

Das Notifyer Objekt reagiert auf die WM:

Delphi-Quellcode:
constructor TNotifyUSB.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FWindowHandle := AllocateHWnd(WndProc);
  USBNotifyRegister;
  ...
end;


function TNotifyUSB.USBNotifyRegister: Integer;
var
  dbi : DEV_BROADCAST_DEVICEINTERFACE;
  Size : Integer;
  r : Pointer;
  ret : Integer;

begin
  ret := DLL_CO_USB_NOTIFY_REGISTER_FAILED;

  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := nil;

  r := RegisterDeviceNotification(FWindowHandle,
                                  @dbi,
                                  DEVICE_NOTIFY_WINDOW_HANDLE);
  if Assigned(r) then ret := 0; // ??? Retwert anpassen

  Result := ret;
end;



procedure TNotifyUSB.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_DEVICECHANGE) then
  begin
    try
      WMDeviceChange(Msg);
    except
      Application.HandleException(Self);
    end;
  end
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
Ich mache nur die DLL. Es kann sein dass eine Funktion der DLL in einem Thread aufgerufen wird, muss aber nicht. Das weiß ich leider nicht.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 10:27
1. So ein Windowhandle klappt. Aber wie gesagt, wenn es in einem eigenen Thread läuft brauchst du eine Messageschleife. Die kannst du allerdings nicht selber implementieren, sondern du musst dies dem Anwender deiner DLL mitteilen.

2. Schau dir mal die Methoden Dispatch und DefaultHandler an. Damit kannst du deine WindowProc-Funktion "schicker" aufbauen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#13

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 5. Nov 2008, 10:29
Muss da jetzt doch nochmal nachhaken:

Ist das Application.ProcessMessages hier wirklich sinnlos?

Delphi-Quellcode:
Sleeper := 0;
while Sleeper < 100 do
  begin
  Sleep(1);
  inc(Sleeper);
  Application.ProcessMessages;
end;
Also folgende Situation: Meine DLL Init Funktion wird im Main Thread aufgerufen. In dieser wird meine Notifyer Objekt erstellt, welcher ein Fenster(-handle) ist welches auf (USB-)WM wartet und bei den entsprechenden WM irgendwelche Aktionen ausführt. Damit gehört diese Fenster doch zum MainThread!?

Nehmen wir mal an, jetzt wird eine andere DLL-Funktion in einem anderen Thread aufgerufen, mein USB Gerät rebootet und ich muss warten, bis mein Notifyer erkennt dass es wieder da ist. Ich kehre also aus der Funktion vorerst nicht zurück. Damit müsste der MainThread solange lahmgelegt sein, oder? Also kann mein Notifyer nicht auf die WM reagieren, oder?

Um dies zu verhindern, also um dafür zu sorgen, dass die WM im Mainthread weiter abgearbeitet werden und mein Notifyer wieterhin funktioniert, müsste Application.ProcessMessages hier doch sogar notwendig sein, oder?

Oder habe ich das Prinzip falsch verstanden?

Nochmals vielen Dank für eure Hilfe und Geduld mit mir.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#14

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 5. Nov 2008, 10:40
Wenn du die DLL programmierst, umnd die Funktion nicht zurückkehren darf, bis das Ding am USB anschlus rebootet ist, ,dann kehrst duu nicht zurück und PUNKT

Wenn der entwickeler der anwendung, der deine dll benutzt dann aber möchte, dass seine anwendung nicht einfreirt, weil die dll-fkt nicht zurückkehrt, dann soll er das eben in einen thread packen

Wenn deine DLL-Funktionen blockieren, dann tun sie es eben. Es istt nicht die aufgabe der DLL dafür zu sorgen, dass die Anwendung flüssig läuft.

Just my 2 cents
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#15

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 5. Nov 2008, 10:51
Oh mann, da habe ich gerade aber nen gewaltigen gedanken fehler

Der abgespaltet Thread wird natürlich lahmgelegt und der MainTread sollte weiter laufen -> Notifyer funktioniert -> Application.ProcessMessages nicht notwending.


Wenn meine Funktion aber nicht in einem separten Thread aufgerufen wird, (was nicht muss aber sein kann, weiss es ja leider nicht), dann ist Application.ProcessMessages notwendig oder?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#16

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 5. Nov 2008, 11:30
Nein. Application.Processmessages ist im Grunde nie notwendig.

Es ist manchmal praktisch, wenn auch etwas unsauber, wenn man verhindern möchte dass die GUI einfriert.

Wenn du nett sein möchtest, kannst du dem Entwickler natürlich auch 2 Versionen anbieten: Eine blockierende, und eine die schaut, obs geht und dann entweder zurückliefert "dauert noch" oder eben den Wert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:08 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