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:

Quelltext
1:
CloseHandle(Event);                    

Und der Code zum CD-Check beenden:

Quelltext
1:
SetEvent(Event);                    



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.