Autor Beitrag
delphiuserno1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82


Delphi 7 enterprise, Delphi 2007
BeitragVerfasst: Mi 30.05.07 19:49 
Hi

Vieleicht hat einer von euch n vorschlag für mich. Also folgendes:
Ich reagiere mit einer procedure auf den wechsel von USB Geräten. Funktioniert auch. Über die WMI hole ich mir die Laufwerksinformationen. Das Problem ist jetzt, wenn ich einen USB Stick einstecke wird die Procedure zum abrufen der akuellen Laufwerksinformationen gestartet (gethddinfo), und genau da kommt ne Exception. Ich denke es liegt daran, dass Windows gerade den zugriff auf die WMI sperrt, weil ein neues USB Laufwerk registriert wird.
Die Frage ist, wie erkenne ich ob ich wieder zugriff habe.

Folgende Exception wird angezeigt (nur im Debug Mode):
"...Exception der Klasse EOleException mit der Meldung 'Ein ausgehender Aufruf kann nicht ausgeführt werden, da eine Anwendung einen eingabe-synchronisierten Aufruf weiterleitet' aufgetreten"

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
procedure TForm1.gethddinfo;  //Laufwerksinformationen über WMI erhalten
Var WMIResults: TWMIInfo;
    i, i2: Integer;
    comp, namespace,username, pass,query  :String;
  J: Integer;
Begin
  StringGrid3.DefaultColWidth := StringGrid3.ClientWidth;
  StringGrid3.RowCount := 1;
  StringGrid3.ColCount := 1;

  comp:='.';
  namespace:='root\CIMV2';
  username:='';
  pass:='';
  query:='    SELECT Name, Model, Caption, InterfaceType, MediaType, Size FROM Win32_DiskDrive';

    If not WMIGetInfo(comp, namespace, username, pass, Trim(query), WMIResults) Then //<---hier wird die exception ausgelöst
      Begin
        StringGrid3.Cells[00] := 'ERROR';
        Exit;
      End;

  StringGrid3.Cells[00] := '';

  If WMIResults.Instance = nil Then
    Exit;

  StringGrid3.DefaultColWidth := Max((StringGrid3.ClientWidth - 20div (Length(WMIResults.Instance) + 1), 100);
  StringGrid3.ColCount := Length(WMIResults.Instance) + 1;
  For i := 0 to Length(WMIResults.Instance) do
    If i = 0 Then
      StringGrid3.Cells[i, 0] := 'Instance'
    Else
      StringGrid3.Cells[i, 0] := IntToStr(i);

  StringGrid3.RowCount := Length(WMIResults.PropName) + 1;
  StringGrid3.FixedRows := 1;
  StringGrid3.FixedCols := 1;

  For i2 := 0 to High(WMIResults.PropName) do
    Begin
      StringGrid3.Cells[0, i2 + 1] := WMIResults.PropName[i2];
      For i := 0 to High(WMIResults.Instance) do
        StringGrid3.Cells[i + 1, i2 + 1] := WMIRead(WMIResults, i, i2);
    End;

  drivesdetected:=Form1.stringgrid3.ColCount - 1;   //Anzahl der Laufwerke ermitteln
  setlength(hddrive, drivesdetected+1);    //Größe des dyn Arrays festlegen
  setlength(wmidrives, 5, drivesdetected);

  for I := 0 to 4 do           //hddrive1: erstes laufwerk
    for J := 0 to drivesdetected-1 do  //wmidrives[1,0] deviceID erstes laufwerk
      begin
        wmidrives[i,j]:=stringgrid3.Cells[i+1,j+1];   //wmidrives-Array füllen
      end;
end;

procedure TForm1.drivedetected(Sender: TObject);
begin
  countletters; //Vergebene Laufwerksbuchstaben zählen
  aktuelldrives:=drivesdetected; 
  gethddinfo;            //<------da is das problem
  if aktuelldrives > drivesdetected then
    begin
      memo1.lines.add('['+timetostr(time)+'] Neues Laufwerk gefunden');
      Timer2.Enabled:=true;      //Timer soll nach laufwerken suchen, denen schon ein Laufwerksbuchstabe vergeben wurde
    end;
end;


Hat jemand ne idee?

Gruß
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 30.05.07 23:14 
Moin!

Diese Exception ist IMHO nur im weitesten Sinne als "Fehler" zu bezeichnen; deshalb würde ich das so machen:

- Zugriff mit try-except
- Im Exception-Fall (auf konkret diese Exception prüfen) 1/2 Sekunde warten und nochmal probieren
- Wiederholen, bis max. Versuche oder Erfolg

:idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
delphiuserno1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82


Delphi 7 enterprise, Delphi 2007
BeitragVerfasst: Do 31.05.07 14:41 
Jo ich weiß ne richtige Fehlermeldung is es eigentlich nich. tritt auch nur im debug mode auf! wenn ich ganz normal die exe starte kommt keine meldung.
Aber das mit dem warten und erneut versuchen werd ich mal probieren danke
delphiuserno1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82


Delphi 7 enterprise, Delphi 2007
BeitragVerfasst: Do 31.05.07 16:21 
nach langem herunprobieren hab ichs endlich geschafft!

habs mit nem timer gemacht. ich weiß nich wieso aber anders habe ich es einfach nicht hinbekommen.

wen es interessiert so sieht es jez aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  aktuelldrives:=drivesdetected;
  gethddinfo;
  if aktuelldrives < drivesdetected then
    begin
      memo1.lines.add('['+timetostr(time)+'] Neues Laufwerk gefunden');
    end;
  if stringgrid3.Cells[0,0] <> 'ERROR' then
    timer1.Enabled:=false;
end;


procedure TForm1.drivedetected(Sender: TObject);
begin
  timer1.Enabled:=true;
end;


ich bin damit ganz zufrieden...funzt jedenfalls genau so wie es soll

Gruß