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
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:
Quelltext
Und der Code zum CD-Check beenden:
Quelltext
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?
Ich hab's nicht getestet, dazu war ich zu faul. Sag mir einfach, ob's tut, so wie du's dir vorstellst.