Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ShellExecute und schreibgeschütztes Medium (https://www.delphipraxis.net/169138-shellexecute-und-schreibgeschuetztes-medium.html)

Poolspieler 1. Jul 2012 21:26

ShellExecute und schreibgeschütztes Medium
 
Hallo,
ich würde mit folgendem Code gern ein externes Programm starten:
Code:
ShellExecute(Application.Handle, 'open', PChar(_datei), PChar(_parameter), Nil, SW_ShowNormal);
Dies funktioniert auch problemlos.

ABER:
Wenn das AUSZUFÜHRENDE Programm auf einem schreibgeschützten Medium (in meinem Fall eine SD-Karte) liegt, dann bekomme ich NUR unter WinXP folgende fehlermeldung von Windows (der Rückgabewert ShellExecute ist OK!):

Zitat:

Der Datenträger ist schreibgeschützt und kann nicht beschrieben werden. Entfernen Sie den Schreibschutz vom Datenträger in Laufwerk D:.
Das ganze tritt unter Win7 NICHT auf.

Ich habe es auch schon mit ShellExecuteEx ausprobiert --> gleiches Ergebnis. :pale:

Warum glaubt WinXP, ShellExecute wolle irgendwo schreibend zugreifen? Ich habe auch schon die notepad.exe mal auf das schreibgeschützte, und mal auf z.B. C:\ gelegt. --> Auf dem schreibgeschützten Verzeichnis bekomme ich die Fehlermeldung - auf C:\ nicht.
--> führe ich die Datei direkt aus (also nicht über ShellExecute, sondern über den Dateiexplorer), dann kommt KEIN Fehler. Es liegt also DEFINITIV am ShellExecute-Aufruf.

Ich versteh die Welt nicht mehr :shock:

Hat jemand eine Idee?

Viele Grüße,

Poolspieler

himitsu 1. Jul 2012 21:38

AW: ShellExecute und schreibgeschütztes Medium
 
Was für eine Datei willst du öffnen und mit welchem Programm ist sie verknüpft?

Einige Programme öffnen Dateien nicht nur ReadOlny oder sie erstellen gerne mal im Verzeichnis der zu öffnenden Datei eine temporäre Hilfsdatei.
> also Schreibzugriffe

Unter Windows 7 könnte da eventuell die Virtualisierung für schlechte/alte Programme zuschlagen.

Poolspieler 1. Jul 2012 22:08

AW: ShellExecute und schreibgeschütztes Medium
 
Hi,
danke für Deine Antwort!

Eigentlich will ich ein von mir geschriebenes Delphi-Programm öffnen.
Oder ein mit Innosetup erzeugtes setup.exe.
Ich habe es aber auch mit der notepad.exe aus WinXP versucht.

--> bei allen Programmen ist es das selbe Problem.

Gruß,

Poolspieler

Poolspieler 1. Jul 2012 22:28

AW: ShellExecute und schreibgeschütztes Medium
 
Hallo,
ich habe eine weiter Erkenntnis:

Das Problem tritt NUR bei SCHREIBGESCHÜTZTEN SD-Karten auf!
--> Bei einer gebrannten CD tritt das Problem NICHT auf.

Vielleicht sind hier die SD-Karten ein magischer Sonderfall und ich sollte diesen im Kleingedruckten der Software-Beschreibung einfach ausschließen...

Aber vielleicht hat ja jemand noch eine bessere Idee...

Viele Grüße,

Poolspieler

WM_CLOSE 2. Jul 2012 01:08

AW: ShellExecute und schreibgeschütztes Medium
 
Ich habe mal einen Filesystem Treiber geschrieben, in den Dokus stand etwas von Dateisystemtypen.
Der CDFS-Treiber hat zum beispiel keine Funktionen zum Schreiben ind ist auch so gekennzeichnet.

Die SD-Karte ist vermutlich FAT32 oder NTFS formatiert, also mit Schreibfunktion, welche nur durch den Schalter an der Karte selbst unterdrückt wird.

PS: versuch es mal mit Hier im Forum suchenCreateProcess

himitsu 2. Jul 2012 08:16

AW: ShellExecute und schreibgeschütztes Medium
 
Bei NTFS wird z.B. das Datum/Uhrzeit des letzten Dateizugriffs gespeichert
und ich glaub im Windows 7-Treiber wurde dieses Verhalten wieder geändert.

Man braucht also nur eine Datei zu öffnen und es geschieht ein Schreibzugriff.


Zusammen mit der Aussage von WM_CLOSE (ups, jetzt ist mein Browser weg) könnte es da schon die Auswirkungen erklären.

WM_CLOSE 2. Jul 2012 09:55

AW: ShellExecute und schreibgeschütztes Medium
 
Nochmal zur Erlklärung: Treiber sind im Grunde wie Klassen, die ein Interface implementieren.

zur Veranschauichung nehmen wir die Interfaces
IWritableFS
{
procedure WrieFile(...);
...
}
und
IReadableFS
{
procedure ReadFile(...);
}

NTFS implementiert beide Interfaces,
CDFS nur IReadableFS

Damit weiß Windows, ob es auf einem bestimmten FS schreiben kann.

Jetzt kommt die NTFS? formatierte SD-Karte. Windows sieht: NTFS->beschreibbar.
Aber die SD-Karte macht mit dem lock einen Strich durch die Rechnung.

Im Vista/7 Treiber für die SD-Karten wurde das problem scheinbar umgangen, indem die tatsächliche Beschreibbarkeit geprüft wird.

Mit CreateProcess müsste es eig. trotzdem gehen.

himitsu 2. Jul 2012 10:13

AW: ShellExecute und schreibgeschütztes Medium
 
Mir fällt auch grade ein, daß ich unter Windows 7 diesbezüglich auch noch keine Probleme bemerkt hab,
auch nicht bei USB-Sticks mit Schreibschutz, egal ob FAT32, ExtFAT oder NTFS.

(bei SD-Karten war ich noch nicht auf die Idee gekommen diese mit NTFS zu beschreiben, da die andere Hardware es eh nie verstanden hätte)


Eventuell solltest du es dann auch nochmal mit solchen USB-Sticks probieren, welche ebenfalls einen Schreibschutzschalter besitzen.



PS: Bei USB wird der Schreibschutz über den Controlerchip im USB-Stick geregelt (den man nur im abgezogenen Zustand umschalten sollte/darf) und je nach dem was dort für ein mistiger Controler verbaut wurde, teilt er dem Dateisystemtreiber ordnungsgemäß mit, ob dieses Medium beschreibbar ist.

Bei den SD-Karten drückt dieser Schalter einen Kontakt im Lesegerät, womit dann natürlich das Lesegerät darauf reagieren muß.
Es könnte also auch sein, daß einige Billiggeräte nicht drauf reagieren, bzw. es erklärt auch, warum einige zu straffe Kontakte gerne mal diesen Schalter beim Einschieben umstellen, was ich mal bei einer Fotokamera hatte. :wall:

Poolspieler 2. Jul 2012 10:45

AW: ShellExecute und schreibgeschütztes Medium
 
Hallo Zusammen,
ich habe nochmal einige (viele) Tests gemacht.

Ergebnisse:
1. Das Problem tritt auch bei schreibgeschützten USB-Sticks auf
2. Ich habe zwei SD-Reader getestet
- einen im Laptop (Samsung) integrierten
- einen externen (getestet unter Win7 und WinXP)
--> bei beiden Readern ist das selbe Verhalten vorhanden
3. ich habe Freund Procmon mal mitlaufen lassen
--> himitsu hat recht. Es wird zuerst ein QueryBasicInformationFile und anschliessend SetBasicInformationFile durchgeführt. Bei SetBAsicInformationFile(CreationTime, LastAccessTime, etc.) kommt der Fehler
4. CreateProcess habe ich versucht, da bekomme ich aber viele Fehler - wahrscheinlich rufe ich den Befehl noch mit falschen Parametern auf - das werde ich im Forum aber mal nachlesen...


Viele Grüße,

Poolspieler

himitsu 2. Jul 2012 11:17

AW: ShellExecute und schreibgeschütztes Medium
 
Es gibt für's NTFS scheinbar einen eine Einstellungsmöglichkeit, wo man solche Schreibaktionen deaktivieren kann.
Aber wie und wo, das weiß ich auch nicht.

Das ist mir mal untergekommen, beim Thema Windows auf Flash-Disk (noch vor den SSD, wo man eine Flash-Karte via IDE angeschlossen hat), oder als Live-System auf USB-Disk laufen zu lassen.
Da diese Speicher eine begrenzte Lebensdauer haben/hatten, was das Beschreiben betrifft, wurde damals irgendein "Hack" verwendet, welcher eben Jenes verhinderte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.
Seite 1 von 2  1 2      

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