Autor |
Beitrag |
Steve1024
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Do 15.09.05 14:14
Hi an alle,
ich hab ein Problem. Ich hab eine CD mit Fremdsoftware, welche von dort aus nicht läuft, weil es Schreibzugriff im Programmpfad haben will. Da das Programm ein sehr teures und überall zu benutzen ist (art Service-CD), soll das natürlich nicht auf C oder so ausgelagert werden. Jetzt habe ich mir gedacht, ich kann doch das ganz auch so gestalten, dass das Program in RAM Drive kopiert wird... ausgeführt... und danach das RAM Drive wieder entfernt.
Problem bei der ganze Sache ist nur ist: WIE MACH ICH DAS???
Ich hab schon Folgenden ansatz:
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: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115:
| unit Unit2;
interface
uses Classes, SysUtils, Windows, Messages;
type
TTestThread = class(TThread) constructor Create; destructor Destroy; override; private FNamedPipe : THandle; FFile : THandle; FEvent : THandle; FOverlapped : TOverlapped;
Res : Cardinal; protected procedure Execute; override;
procedure ShowMsg; end;
implementation
uses Unit1;
constructor TTestThread.Create; Begin inherited Create(FALSE);
FNamedPipe := CreateNamedPipe('\\.\pipe\Test', PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 4096, 4096, 2000, nil); IF FNamedPipe = INVALID_HANDLE_VALUE then Begin MessageBox(0,'NamedPipe error',nil,0); Halt(1); end;
FEvent := CreateEvent(nil,False,False,nil); ZeroMemory(@FOverlapped,SizeOf(FOverlapped)); FOverlapped.hEvent := FEvent;
IF not DefineDosDevice(0,'V:','\\.\pipe\Test') THEN Begin MessageBox(0,'DosDevice error',nil,0); Halt(1); end; end;
destructor TTestThread.Destroy; Begin DefineDosDevice(DDD_REMOVE_DEFINITION,'V:',nil);
CloseHandle(FFile); CloseHandle(FEvent);
IF DisconnectNamedPipe(FNamedPipe) THEN CloseHandle(FNamedPipe);
inherited; end;
procedure TTestThread.Execute; var Buff : Cardinal; Size : Cardinal; Begin while not Terminated do Begin begin
if ConnectNamedPipe(FNamedPipe,nil) then Begin ReadFile(FNamedPipe,Buff,SizeOf(Buff),Size,nil); Res := Buff; WriteFile( FNamedPipe,Buff,SizeOf(Buff),Size,nil);
FlushFileBuffers(FNamedPipe); DisconnectNamedPipe(FNamedPipe);
Synchronize(ShowMsg); end; end; end; end;
procedure TTestThread.ShowMsg; Begin Form1.Label1.Caption := IntToStr(Res); end;
end. |
Dieser Code funzt auch schon fast... allerdings wirklich nur fast.. denn ich bekomme immer irgendwelche Meldungen vom Windows und hab keine Ahnung was ich da zurücksenden soll... Also komm im Explorer immer die Meldung "Falscher Parameter"
Des öfteren kommt es aber auch vor, dass im Explorer die Meldung kommt: "Alle Pipeinstanzen sind ausgelastet"... was ich auch ned versteh.
BITTE HELFT MIR.... bin voll am Verzweifeln.... :'(
|
|
MisterBum
      
Beiträge: 107
|
Verfasst: Do 15.09.05 14:18
Steve1024 hat folgendes geschrieben: |
Problem bei der ganze Sache ist nur ist: WIE MACH ICH DAS???
|
Lade dir einfach aus dem Internet den Virtual Daemon Manager V 3.47!!!
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Do 15.09.05 14:32
Titel: ????
Durch das, dass es ja eine Service-CD werden soll... will ich natürlich auf dem Client-PC auch nix installieren....
sonst würde ich ja auch keine RAM-Disk brauchen.
Außerdem gäbe es dann auch viele schöne Lösungen mit Treibern usw....
Ich brauch die Lösung... ohne dass am Client-PC etwas verändert wird... und das ist nunmal der Speicher...
dazu kommt noch, dass die CD Startfähig ist (Windows) und das Programm dann auch laufen sollte (auch wenn auf dem Client-PC Linux oder so läuft). Da diese aber auch ein anderes Dateisystem haben, kann ich da nix auslagern und auch nicht installieren....
Hat mir bitte einer eine andere Lösung???? Ist echt wichtig... DANKE

|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 15.09.05 14:42
such dir im internet ein ram disk tool das keine installation benötigt, und schmeiss das samt ner batchdatei die alles rüberkopiert auf die cd
edit: wahrscheinlich reichts sogar alles auf C:\ zu kopieren (normal hat jeder rechner ein C:\)
danach halt das verz. wieder löschen
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Do 15.09.05 15:02
Titel: hmmm...
ok... also.. ein tool welches keine installation benötigt habe ich nicht gefunden...
wegen dem C: ... hatte ich ja beschrieben... bei Linux oder FreeBS oder so ähnlich wird es kein C geben, weil es kein FAT oder NTFS FileSystem ist.
Außerdem wenn ich von CD starte... ist das CD-ROM C:... also kein schreib zugriff....
Kann mir denn keiner sagen, wie ich das selber machen kann....???
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 15.09.05 15:11
Titel: Re: hmmm...
Steve1024 hat folgendes geschrieben: | ok... also.. ein tool welches keine installation benötigt habe ich nicht gefunden... |
dann wirst du nicht genau genug gesucht haben. bei der bart pe cd ist zum beispiel eines dabei. für deine zwecke ist BART PE sowieso ein heisser tip (war übrigens auch bei der vorletzten c't auf cd und anleitung mit drauf)
Steve1024 hat folgendes geschrieben: | wegen dem C: ... hatte ich ja beschrieben... bei Linux oder FreeBS oder so ähnlich wird es kein C geben, weil es kein FAT oder NTFS FileSystem ist. |
aber deine delphi programme laufen da ?
Steve1024 hat folgendes geschrieben: | Außerdem wenn ich von CD starte... ist das CD-ROM C:... also kein schreib zugriff.... |
also wenn ich von einer bootfähigen cd starte, ist diese dann laufwerk A:, und das ursprüngliche laufwerk A: wird zu B:
Steve1024 hat folgendes geschrieben: | Kann mir denn keiner sagen, wie ich das selber machen kann....??? |
gib erst mal ein paar mehr details her. ist deine cd bootfähig? wenn ja, welches betriebssystem läuft darauf?
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Do 15.09.05 15:17
OK: Also... CD Bootfähig... Win98 oder XP (in dem Fall dann DVD)... meine Progs laufen von der CD aus...
es sind da dann aber auch progs, die nicht von mir sind... die neine LOG und eine INI-Datei schreiben wollen... dafür brauch ich nun eine RAM-Disk...
Zur Funktionsweise:
Klick im StartMenü oder auch Autorun
RAMD-Disk erstellen
Programm in RAM-Disk kopieren
Schreibschutz aufheben
Ausführen
nach der ausführeung RAD-Disk wieder löschen
genaus so soll das ausgeführt werden.
So... das muss ich jetzt realisieren und schreiben... nur wie?
Wie gesagt.. der Source oben ist schon nicht schlecht.. wenn alles funktionieren würde... d.h. einfach einen Pointer ähnliches dahinter legen und windows alles machen lassen... da heisst es aber dann immer... alle Pipeinstanzen sind ausgelastet...
Hoff dass mir jemand helfen kann.... DANKE
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 15.09.05 18:31
www.codeguru.com/Cpp...t/article.php/c5789/
die ramdisk lässt sich nur über einen treiber erzeugen. folglich musst du den beim start deines bootfähigen windows mitladen. der rest sollte dann recht einfach sein.
bei dem treiber oben sind auch die c++ sourcen dabei.
alternativ:
support.microsoft.com/kb/q257405/
am einfachsten wird es aber sicher sein, wenn du dir bart pe zur brust nimmst, dir die skripte anschaust die eine ram disk verwenden, und dann ein ähnliches skript bastelst.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Do 15.09.05 18:58
OK... aber es muss doch auch ohne Treiber gehen... hab schon von mehreren Programmen gehört, welche mit Delphi geschrieben wurden, welche dies können....
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 15.09.05 20:15
echt ? warum fragst du dann nicht die leute, von denen du das gehört hast ?
eines kann ich dir gleich sagen, mit einer pipe wird das nicht funktionieren 
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Do 15.09.05 21:29
warum dann die Meldung: Alle Pipeinstanzen ausgelastet im Windows Explorer....
Wenn ich dann noch eine Schleife mit ConnectNamedPipe mach kommt die Meldung auch nicht mehr...
Ich kann auch die Daten, welche an das Pipe gesendet werden auswerten... (wenn ich wüsste was das für eine Anfrage ist, nur das ist ja genau das.... ich weiss das nicht)...
Ich habe das in google groups gelesen, dass es da ein paar programme gibt. z.B: PGP Freeware soll so eins sein.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 16.09.05 11:36
PGP ist weder mit Delphi geschrieben (reinster C++-Code), noch kommt es ohne Treiber aus (das Teil nutzt mehrere Treiber (für virtuelle Netzwerkkarten, für Laufwerke, Memory-Verwaltung, ...). Da hast du was falsches gehört.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 16.09.05 11:45
ich hab mir den code oben (stammt übrigens aus dem swissdelphicenter) mal genauer angesehen und recherchiert. es könnte tatsächlich möglich sein, mit einer pipe ein laufwerk zu simulieren (pipe verwendet ein filesystem names NPFS).
ich werde mal ein bischen mit dem code rumspielen und ne lösung posten wenn ich eine finde
@steve: du solltest dir zwischenzeitlich wirklich mal BART PE ansehen, wenn du schnell eine lösung willst (ist ein windows xp das komplett von cd startet und programme in die ram disk entpackt).
den hinweis darauf hast du ja bislang geflissentlich ignoriert.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Fr 16.09.05 11:50
OK... das wusste ich nicht.
Gut.. aber trotzdem muss es doch mit Delphi so auch funktionieren... Denn das Laufwerk hab ich ja...
Ich hab jetzt auch mal die Anforderungen ausgewertet....
4235 und 36 werden an mein Programm gesendet (Cardinal).
ich weiss nur nicht, was ich zurücksenden muss.
Gibt es da irgendwo eine Tabelle, wo man nachlesen kann, welche ID was
bedeutet und was man dann antworten muss...
Ich habe schon probiert, die gleiche Zahl als Antwort zu senden, dann bekomm ich aber die Meldung "Falscher Parameter"... sende ich nix genauso...
Lass ich die Anfrag offen...(d.h. Lese sie gar nicht), heisst es wieder, alle Pipeinstanzen ausgelastet...
Also irgendwie muss es ja gehen, denn sonst hätte ich ja nicht solche Reaktionen, oder??
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 16.09.05 11:57
Steve1024 hat folgendes geschrieben: |
4235 und 36 werden an mein Programm gesendet (Cardinal).
ich weiss nur nicht, was ich zurücksenden muss.
Gibt es da irgendwo eine Tabelle, wo man nachlesen kann, welche ID was
bedeutet und was man dann antworten muss...
|
falls es sich um window messages handle't (  ) www.delphipraxis.net..._windowmessages.html
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Steve1024 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Fr 16.09.05 12:11
OK, probier ich mal aus... danke...
ich hab jetzt aber nich in google groups gesucht und da was gelesen dass es am besten mit ControlIODevice() funktionieren würde.
Weiss jemand, wie das geht?? Ich meine für eine Image-Datei gibt es dort ettliche Beispiele... aber für eine MMF oder so gibt es da kein Beispiel... Dass wäre nämlich dei perfektere Variante davon... *g*
Denn dann handelt Windows von alleine und formatiert usw. den Speicher...
also sollte irgendwie so aussehen...
MMF Erstellen
Device erstellen (machen die da irgendwie mit CreateFile('\\.\vw...) k.A.
dann die MMF in Device laden (über ControlIODevice)
und dann halt den Laufwerksbuchsaten auf das Device legen
... so funzt es jeden fall mit Images... *g*
Wäre echt nedtt und cool, wenn mir da jemand helfen könnte... - Danke
|
|
Ivo@CoMRoK
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Mo 12.06.06 13:37
Also ich würd auch zu BartPE raten.
Da is schon ne RAMDISK drin  , ausßerdem kannst du viel da selbst gestalten.
mfg Ivo
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
|