Entwickler-Ecke
Sonstiges (Delphi) - automatisch selbst kopieren und....
bluecat - Sa 11.01.03 23:30
Titel: automatisch selbst kopieren und....
Hallo experten!
möchte ich ein kleines program schreiben,dann auf CD speichern.Das startet automatisch gleich nachdem ich die CD-ROM rein tue, ohne irgendeine handlung zu machen,es muss automatisch sich selbst in einem ort auf der Festplatte speichern und danach im hintergrund laufen (unsichtbar) und prüfen ob cd noch da ist (CD-ID exist),wenn nicht dann kommt eine Meldung und fordert den user die cd reinlegen muss.
gibt es möglichkeit wenn ich die datei nicht durch autorun.inf aufrufe?
geht das mit keyboard-hook oder mause-hook,dass wenn ich CD-ROM starte,macht das Program wie ich oben beschreibe?
Kann ich mit einem program einanderes abschalten? wenn ja dann wie kann ich deaktivieren?
Kann jemand mich helfen?
Andreas Pfau - So 12.01.03 01:27
Oh je, da hast Du dir aber was vorgenommen. Also, mal ganz langsam:
1) Autorun (weißt du warscheinlich schon)
Autorun.inf (Im Stammverzeichnis der CD):
Quelltext
1: 2:
| [autorun] open=application.exe |
2) Programm unsichtbar laufen lassen
Ganz einfach. Leg eine neue Anwendung an und lösche das Formular (Projekt/Aus dem Projekt entfernen). Dann hast du nur noch eine DPR. Öffne sie:
Quelltext
1: 2: 3: 4: 5: 6:
| {...} begin Application.Initialize; Application.CreateForm(TMain, Main); Application.Run; end. |
Daraus machst Du:
Quelltext
1: 2: 3: 4: 5: 6:
| {...} begin Repeat {...} Until {...}; // Due Abbruchbedingung kommt später end. |
Voila, kein form mehr.
3) Die CD checken
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:
| {...} uses SysUtils, ...usw. {...}
// Ermittlet die Seriennummer function GetDriveSerial(Drive: Char): Cardinal; var C1, C2, OldErrorMode: Cardinal; begin OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); If Not GetVolumeInformation(PChar(DriveCharToPath(Drive)), Nil, 0, @Result, C1, C2, Nil, 0) Then Result := 0; SetErrorMode(OldErrorMode); end;
var Drive: Char; Serial: Cardinal; begin // Wir übergeben den Pfad der CD als 1. Konsolen-Parameter
If ParamStr(1) = '' Then Halt;
Drive := UpperCase(ParamStr(1))[1]; // Seriannummer speichern Serial := GetDriveSerial(Drive);
Repeat If GetDriveSerial(Drive) <> Serial Then ShowMessage('Bitte legen Sie die CD wieder ein!!!'); Sleep(1000); // Nur im Sekundentakt prüfen, nicht permanent (schont CPU) Until {...}; end. |
4) Nun noch das "fernsteuern"
Es geht auch anders. Aber wenn du es über eine andere Anwendung machen willst, hier die Lösung:
Deine "Fernsteuerung" initialisiert erst mal:
Quelltext
1: 2: 3: 4:
| var Event: Cardinal; {...} Event := CreateEvent(Nil, True, False, PChar('Remote CD-Check Shudown')); |
Der code zum destroyen:
Und der Code zum CD-Check beenden:
Deine CD-Checker-Anwendung:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| {...} var Event: Cardinal; {...} Event := 0; Repeat {...}
// Hier waren wir ja schon
If Event = 0 Then OpenEvent(Event_All_Access, False, PChar('Remote CD-Check Shudown'));
Until (Event <> 0) And (WaitForSingleObject(Event, 0) = Wait_Object_0); end. {...} |
5) Noch was: Die Datei auf der CD
Ebenfalls eine Anwendung ohne Form. Die kopiert die grade beschriebene Anwendung auf die Festplatte, damit sie dort ungestört laufen kann. die andere Anwendung heißt jetzt mal CDCheck.exe und ist ebenfalls im stammverzeichnis der CD.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| {...} uses ShellApi; {...} begin CopyFile(PChar('CdCheck.exe'), PChar('C:\Programme\CDCheck\CDCheck.exe'), False); ShellExecute(0, Nil, PChar('C:\Programme\CDCheck\CDCheck.exe'), Nil, Nil, Sw_ShowNormal); end. |
Noch fragen? :wink:
Ich hab's nicht getestet, dazu war ich zu faul. Sag mir einfach, ob's tut, so wie du's dir vorstellst.
wulfskin - So 12.01.03 01:38
Hallo!
Aber es ist nicht gesagt, das der Endnutzer Autorun auf Ein gestellt hat...
Gruß Hape!
Andreas Pfau - So 12.01.03 12:30
Hallo Wolfshaut,
ja, danke für den Hinweis. Habe das grade per persönlicher Mail abgeklärt. Die einzige Umgehung ist es, die Anwendung fest zu installieren.
matze - So 12.01.03 13:12
es gibt leider keine andre möglichkeit die programme einer CD autoarisch starten zu lassen ausser über die INF !!!
Andreas Pfau - So 12.01.03 14:37
@Matze, du sagst es!
Ich würde es so machen, dass einfach beim ersten Startder Anwendung (sei es durch den Benutzer oder durch autorun.inf) eine 2. Anwendung auf der Festplatte installiert wird (der CD-Check). Der läuft dann im Autostart, und prüft ob die CD eingelegt wird, und ist dann "scharf". Der CD-Check bekommt dann eine 2. Aufgabe: Die Installationanwendung auf der CD abwürgen (z.B. Kommunikation mit Events, Mutex, Semaphoren Registry, DDE, COM, es gibt viele Möglichkeiten), damit das Programm kein 2. mal installiert wird.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!