Autor Beitrag
bluecat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Sa 11.01.03 23:30 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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):
ausblenden 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:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
{...}
begin
  Application.Initialize;
  Application.CreateForm(TMain, Main); 
  Application.Run;
end.

Daraus machst Du:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
{...}
begin
 Repeat
  {...}
 Until {...}; // Due Abbruchbedingung kommt später
end.


Voila, kein form mehr.

3) Die CD checken
ausblenden volle Höhe 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:
ausblenden Quelltext
1:
2:
3:
4:
var
 Event: Cardinal;
{...}
Event := CreateEvent(Nil, True, False, PChar('Remote CD-Check Shudown'));

Der code zum destroyen:
ausblenden Quelltext
1:
CloseHandle(Event);					

Und der Code zum CD-Check beenden:
ausblenden Quelltext
1:
SetEvent(Event);					



Deine CD-Checker-Anwendung:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: So 12.01.03 01:38 
Hallo!

Aber es ist nicht gesagt, das der Endnutzer Autorun auf Ein gestellt hat...

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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 !!!

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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.