AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Devicechange aus Service mitbekommen
Thema durchsuchen
Ansicht
Themen-Optionen

Devicechange aus Service mitbekommen

Ein Thema von Memnarch · begonnen am 10. Mai 2012 · letzter Beitrag vom 11. Mai 2012
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Devicechange aus Service mitbekommen

  Alt 10. Mai 2012, 10:09
Tag allerseits,
Ich bin einfach nur am verzweifeln.
Ich habe mir eine Button1 anwendung gemacht, welche WM_DEVICECHANGE behandelt. Ich kann jetzt ohne probleme erkennen ob ein USB datenträger, Netzlaufwerk angeschlossen oder eine CD/DVD eingelegt wurde. ich bekomme ebenfalls Infos wie Laufwerksbuchstaben raus.

Das ganze in einen Dienst gepackt und schon geht rein gar nichts mehr.
Ok ist klar, dienste haben in der Regel kein Fenster.

RegisterDeviceNotification ausprobiert, bringt aber rein gar nichts. Ich bekomme zwar mit das sich was geändert hat, aber keinerlei informationen was genau(z.B ob und welches Volume). Das bringt mich nicht weiter.
(Es sei denn ich habe bei dieser Methode etwas entscheidendes übersehen).

Also die schmutzige methode. Dienst erstellt einfach ein Fenster und lässt ne Messageloop laufen. Klasse ich finde jetzt wieder wie bei der Button1 anwendung raus was mit USB Volumes passiert und bekomme die entsprechenen informationen. ich kann ja jetzt wieder über WM_DEVICECHANGE arbeiten.

Tja zu früh gefreut, denn aus irgendeinem grund wird keine WM_DEVICECHANGE empfangen, wenn es sich um eine CD/DVD oder ein Netzlaufwerk handelt(?).

Was ich brauche an informationen:
Wurde ein Volume angeschlossen/eingesteckt?(Sowohl USB als auch Netzlaufwerk und CD/DVD)
Welchen Laufwerksbuchstaben ist diesem zugeordnet?

Ich wäre wirklich sehr froh, wenn mir jemand nen schubser in die richtige Richtung geben könnte.

Hintergrund:
Ich arbeite gerade in der Gruppe an einem Projekt, bei dem es darum geht unerwünschte Datenträger wieder rauszuschubsen(ja es muss ein dienst sein). In der Button1 anwendung alles prima, im Dienst leider nicht mehr.
Ich brauche keine Komplettlösung, aber ein Hint zu nützlichen Dokus/Infos wäre klasse.

MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Devicechange aus Service mitbekommen

  Alt 10. Mai 2012, 15:23
Ich brauche keine Komplettlösung, aber ein Hint zu nützlichen Dokus/Infos wäre klasse.
Bei mir funktioniert das Monitoring eines Devicewechsels unter WinXP grundsätzlich auch in der eigenen Service-App sowohl beim Wechsel einer CD/DVD als auch beim Anschluss irgend eines USB-Geräts (Scanner, Drucker, Stick, externe HD):

Code:
Const  LogFileName = 'c:\temp\logged.txt'; // z.B.

procedure LogMessage(const Msg: string);
const
  OpenFlags: array[Boolean] of Integer = (fmCreate or fmShareExclusive,
    fmOpenReadWrite or fmShareExclusive);
Var
 FileStream : TFileStream;
begin
begin
// hier Msg in Logfile speichern oder sonstwas machen ...
  FileStream := TFileStream.Create(LogFileName, OpenFlags[FileExists(LogFileName)]);
  try
    FileStream.Seek(0, soFromEnd);
   FileStream.Write(PChar(Msg + #13#10)^, Length(Msg) + 2)
  finally
    FileStream.Free;
  end;
end;

procedure TService1.WndProc(var AMsg: TMessage);
begin
  if AMsg.Msg = WM_DEVICECHANGE then
    LogMessage(format('%s Message: %s', [FormatDateTime('dd.mm.yyyy hh:nn:ss', Now), 'WM_DEVICECHANGE']));
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
  while not Terminated do
    ServiceThread.ProcessRequests(true);
end;
Die weitere Analyse der Feinheiten (Gerätetyp, ggf. Laufwerksbuchstaben, usw.) habe ich aber so schnell noch nicht einbauen können; ist ja etwas aufwändiger. Hilft's trotzdem was ?
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: Devicechange aus Service mitbekommen

  Alt 11. Mai 2012, 11:58
so klappt das leider bei mir nicht
bei wm_devicechange bekomme ich in WParam kein arrival event und als struktur kein DBT_DEV_VOLUME.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  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 10:26 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