Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [JEDI] TUSBDeviceTree: USB System absturz? (https://www.delphipraxis.net/105473-%5Bjedi%5D-tusbdevicetree-usb-system-absturz.html)

Nuclear-Ping 22. Dez 2007 14:19


[JEDI] TUSBDeviceTree: USB System absturz?
 
Hoi,

ich spiele grad mit der TUSBDeviceTree-Komponente aus der SetupAPI von JEDI rum, um in unserer Anwendung eine elegantere Methode zur Erkennung unserer Hardware einzubauen.

Nun ist es mir bei der Demo der Kompo und auch in der eigenen Anwendung gestern 2-3x reproduzierbar passiert, dass das USB-System von meinem Vista Lappi garnicht mehr wollte. Soll heissen: Er hat dann garnichts mehr gemacht, wenn ich Hardware (selbst meinen USB-Stick) reingesteckt oder rausgezogen hab und Fenster- oder Menüinhalte wurde teilweise nicht mehr gezeichnet. Mußte jedesmal das System neu starten. Auf meinem XP Rechner hier konnte ich das bisher nicht nachvollziehen.

Hat jemand das auch? Oder kann hierzu was sagen?

Delphi-Quellcode:
procedure TRadionicMainContainerForm.Button1Click(Sender: TObject);

  function ScanDeviceTree (Dev: TUSBDevice): Boolean;
  var
    I: Integer;
    Node: TTreeNode;
  begin
    Result := FALSE;
    if Dev <> nil then
      begin
        if Dev.IsHub then
          for I := 0 to Dev.Count - 1 do
            begin
              Result := ScanDeviceTree (Dev.Devices[I]);
              if Result then
                Exit;
            end
        else begin
               if Pos (Dev.DeviceDescription, 'Light Quantum Resonator USB') = 1 then
                 begin
                   Result := TRUE;
                   Exit;
                 end;
             end;
     end;
  end;

var
  s: String;
  a: Integer;
  Found: Boolean;
  USBHostCtrl: TUSBHostController;
begin
  for a := 0 to USBDeviceTree1.Count - 1 do
    begin
      USBHostCtrl := USBDeviceTree1.HostControllers[a];
      Found := ScanDeviceTree(USBHostCtrl.RootHub);
    end;
  if Found then
    ShowMessage ('OK')
  else ShowMessage ('No');
end;

procedure TRadionicMainContainerForm.USBDeviceTree1DeviceChange(
  Sender: TObject);
begin
  Button1Click (Self);
end;

Nuclear-Ping 26. Dez 2007 14:47

Re: [JEDI] TUSBDeviceTree: USB System absturz?
 
*push*

Nuclear-Ping 28. Dez 2007 16:48

Re: [JEDI] TUSBDeviceTree: USB System absturz?
 
Hm, unter XP passiert das nicht. Da kann ich die Hardware raus- und reinstecken wie ich will, macht er alles mit ... :gruebel:

Nuclear-Ping 28. Dez 2007 18:25

Re: [JEDI] TUSBDeviceTree: USB System absturz?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ok, irgendwie ist die "TUSBDeviceTree"-Komponente verbuggt oder so.

Folgendes ließ sich auf 2 XP-Systemen und 1 Vista-System immerwieder reproduzieren:

- Neues Projekt
- Button + Edit + OpenDialog auf die Form
- USBDeviceTree-Komponente auf die Form
- Button-Event: if OpenDialog1.Execute then Edit1.Text := OpenDialog1.FileName;

Anwendung starten, Button klicken und im Dialog entweder Abbrechen oder 'ne Datei wählen. Das Ergebnis ist immer das, dass die Anwendung im Hintergrund nicht mehr reagiert. Man kann zwar das Fenster verschieben und über Radio- oder Checkboxen sieht man 'nen Hover-Effekt von der Maus, aber keine Komponente / Programmleiste reagiert mehr auf Eingaben. Man kann das Programm nur noch durch den Task-Manager schließen.
Entfernt man die USBDeviceTree-Kompo von der Form, funktioniert wieder alles.

Beispiel-Projekt ist im Anhang.

[edit]
Das Problem wird im constructor TUSBDeviceTree.Create verursacht, durch setzen des Hooks. Keine Ahnung, wie oder warum. Aber wenn man ihn auskommentiert, funktioniert die Anwendung mit der Kompo wieder. Wahrscheinlich wird der Wechsel der USB-Geräte nicht mehr erkannt, dafür benutze ich aber erstmal ein Work-Around (http://www.delphi3000.com/articles/article_4841.asp?SK=).
Delphi-Quellcode:
constructor TUSBDeviceTree.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDeviceChangeEvent := nil;
  LoadConfigManagerAPI;
  RescanDevices;
{  if not (csDesigning in ComponentState) then
    Application.HookMainWindow(EventPipe);}
end;

destructor TUSBDeviceTree.Destroy;
begin
  // to prevent strange problems
  FDeviceChangeEvent := nil;
{  if not (csDesigning in ComponentState) then
    Application.UnhookMainWindow(EventPipe);}
  Clear;
  UnloadConfigManagerAPI;
  inherited Destroy;
end;
[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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 by Thomas Breitkreuz