Autor Beitrag
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 352
Erhaltene Danke: 6

XP, W7, W8
Deutschland
BeitragVerfasst: Di 03.04.18 08:40 
Hallo, wieder mal ein Problem:

Ich habe ein Programm, welches von einem USB 3.0-Stick Daten liest. Dieses Programm soll sofort nach dem Hochfahren
gestartet werde, Da der Rechner eine ZBox von Zotac ist, wurde der USB 3.0-Treiber von CD nach-installiert.
Zu 50% aller Startversuche unterbricht das Programm, da USB 3.0 nicht gelesen werden kann (der Treiber ist noch nicht da).

Nun meine Frage:

Gibt es eine Möglichkeit, dieses Verhalten zu ändern.
Versucht habe ich alles Mögliche, auch warten auf den Treiber innerhalb des Progamms nutzt nichts.
Wird das Programm von Hand gestartet, ist alles ok. Der Scheduler nutzt nichts, da nach dem Einschalten des Rechners das Progamm laufen soll.

Es war schon eine Aufgabe, die ZBox nach Strom-an zu starten, ohne daß das Bios 3 Stunden braucht (hi)!

Danke schon mal im Voraus.
Hansi

_________________
Brain: an apparatus with which we think we think.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 03.04.18 10:22 
Guten Tag ssb-blume,

ermittel' mal die Treiber mit den Methoden EnumDeviceDrivers() und GetDeviceDriverBaseName(). Vergleiche mit der letzten Funktion den Treibernamen mit dem des USB 3.0 Treibers. Sollte dieser gegeben sein, führe den "Kopiervorgang" aus.
Ein (C++) Beispiel steht dir auch zur Verfügung, siehe unter Examples.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 352
Erhaltene Danke: 6

XP, W7, W8
Deutschland
BeitragVerfasst: Di 03.04.18 11:44 
Danke, Frühlingsrolle. Der Treiber ist ja da, er wird halt nicht sofort gestartet vor dem Autostart!
Das ist das Problem, ich kann den Treiber nicht vom Programm aus starten, da ist er auch nicht da, denn das Betriebssystem W/ will das partout nicht vorher machen!

Ed geht also darum, vor dem Autostart erst w7 Zeit zum Treiber-install zu lassen. Während das Programm läuft, macht das W7 nicht, also müßte ich vor dem Programmstert etwas warten. Wie???

Hansi

_________________
Brain: an apparatus with which we think we think.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 03.04.18 12:02 
Wie gesagt, ermittel den gesuchten Treiber, nachdem die Anwendung ausgeführt wurde. Wie schon in der EnumDeviceDrivers() Funktion geschrieben steht:
"Retrieves the load address for each device driver in the system."

Von dem C++ Beispiel die Übersetzung nach Delphi:

ausblenden 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:
function IsDriverInList(AList: TStrings; const sDriver: string): Boolean;
  procedure ListAllDrivers(AList: TStrings);
  const
    ARRAY_SIZE = 1024;
  var
    drivers: array[0..ARRAY_SIZE - 1of DWord;
    szDriver: array[0..ARRAY_SIZE - 1of Char;
    cbNeeded: DWord;
    cDrivers, i: Integer;
  begin
    AList.BeginUpdate;
    if EnumDeviceDrivers(@drivers, SizeOf(drivers), cbNeeded) and (cbNeeded < SizeOf(drivers))  then
    begin
      cDrivers := cbNeeded div SizeOf(drivers[0]);
      for i := 0 to cDrivers - 1 do
      begin
        if GetDeviceDriverBaseName(Pointer(drivers[i]), szDriver, SizeOf(szDriver) div sizeof(szDriver[0])) > 0 then
        begin
          AList.Add(szDriver);
        end;
      end;
    end;
    AList.EndUpdate;
  end;
begin
  ListAllDrivers(AList);
  result := AList.IndexOf(sDriver) > -1;
end;

Erstell dazu eine StringListe, übergib' sie der Methode, ruf' die Methode z.B. im Timer auf. Sobald die Methode True ergibt, kannst du dein gewünschtes Vorhaben einleiten und den Timer deaktivieren.
Und: uses PsAPI;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 352
Erhaltene Danke: 6

XP, W7, W8
Deutschland
BeitragVerfasst: Di 03.04.18 13:00 
Danke! Ich versuche das mal. Eigendlich hätte ich auch darauf kommen können. Aber man wird langsam alt und vergesslich...

Hansi

_________________
Brain: an apparatus with which we think we think.
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 352
Erhaltene Danke: 6

XP, W7, W8
Deutschland
BeitragVerfasst: Di 03.04.18 13:42 
Nein!!
Leider funktioniert dies nicht, weil:::
Da hängt kein Datenträger dran, sondern UMONE, das ist ein MIDI-In_Out zu USB und daher wird der Treiber nicht aufgeführt!.
Aber die Idee mit dem Timer werde ich mal probieren.

Hansi

_________________
Brain: an apparatus with which we think we think.
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 352
Erhaltene Danke: 6

XP, W7, W8
Deutschland
BeitragVerfasst: Di 03.04.18 13:48 
Da habe ich doch noch eine Doku gefunden:

Auf einigen Computern wird der Treiber u. U. nicht korrekt geladen, wenn das UM-ONE beim Start von Windows bereits angeschlossen ist. In diesem Fall kann das UM-ONE nicht über USB betrieben werden. Warten Sie mit dem Anschließen von UM-ONE, bis Windows gestartet wurde.
Wenn das UM-ONE nach der Rückkehr aus dem Energie sparen-Modus nicht korrekt funktioniert, sollten Sie alle Anwendungen beenden, die das UM-ONE verwenden, und anschließend das USB-Kabel des UM-ONE entfernen und wieder anschließen.
Wenn das USB-Kabel während der Verwendung des UM-ONE entfernt und wieder angeschlossen wird, kann es ggf. nicht mehr korrekt funktionieren. Nachdem der Computer aus dem Ruhezustand zurückgekehrt ist, sollten Sie in diesem Fall alle Anwendungen beenden, die das UM-ONE verwenden, und das USB-Kabel des UM-ONE entfernen und wieder anschließen.

Also alles klar. GEHT NICHT!!
Hansi

_________________
Brain: an apparatus with which we think we think.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18685
Erhaltene Danke: 1618

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.04.18 08:16 
Für den Fall habe ich mir einmal etwas gebastelt... in dem Fall ging es um einen Kopierschutz-Dongle...
Und zwar habe ich das entsprechende USB-Gerät gekillt und dann die Hardwareerkennung gestartet. Danach ging das Gerät dann problemlos.
Leider finde ich aktuell nicht mehr wie ich das gemacht habe.

Du könntest aber einmal testen, ob das funktioniert, wenn du es manuell im Gerätemanager so machst.

Und die andere Möglichkeit, wenn es um einen speziellen Fall geht:
Einfach einen Schalter per USB-Steuerung vorschalten, sodass du dann aus der Anwendung das Gerät aus- und wieder einschalten kannst.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
ssb-blume Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 352
Erhaltene Danke: 6

XP, W7, W8
Deutschland
BeitragVerfasst: Do 05.04.18 08:44 
Danke Jänicke,
ich habe schon eine kleine Platine mit Relais-Steuerung für Stromversorgung des Rechners bis er runter gefahren ist.
Auch das Hochfahren geht so automatisch, alles über NE555 für die Zeiten.
Da wäre es ein leichtes, ein Relais dazu zweckentfremden. Nun ist das Problem, gibt es Schalter spannungsgesteuert oder muß ich alles selber mit Steckerlies bauen?
Mir ist auch nicht bekannt, ob das Um-one die Stromversorgung oder den Datenpfad für das Laden des Treibers benutzt.
Das Ganze ist eine Orgel mit einem Hauptschalter, den ich gerne allein hätte.

Hansi

_________________
Brain: an apparatus with which we think we think.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18685
Erhaltene Danke: 1618

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.04.18 09:36 
Ich kenne USB-Kabel mit manuellem Schalter. Vielleicht kann man solch eines als Basis nehmen. Elektrisch kenne ich leider keine fertigen.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: So 08.04.18 12:59 
Falls im BIOS ein Menüpunkt "Fast Boot Feature" oder "Quick Boot" vorhanden ist: Dieses Feature ausschalten.
Falls „Legacy USB Support“ vorhanden ist: diese Funktion aktivieren („Enabled“).