Autor Beitrag
Steve1024
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-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:
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);

    // Pipe erstellen
      FNamedPipe := CreateNamedPipe('\\.\pipe\Test',
        PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE,
        1409640962000nil);
      IF FNamedPipe = INVALID_HANDLE_VALUE then
      Begin
        MessageBox(0,'NamedPipe error',nil,0);
        Halt(1);
      end;

    // Keine Ahnung wozu ich das brauch *g* :)
        FEvent := CreateEvent(nil,False,False,nil);
        ZeroMemory(@FOverlapped,SizeOf(FOverlapped));
        FOverlapped.hEvent := FEvent;

    // damit kommt immer "Alle Pipes ausgelastet" und CPU auf 100%... ohne nur "Falscher Parameter"
{
        FFile := CreateFile( '\\.\pipe\Test',
          GENERIC_ALL,
          FILE_SHARE_WRITE OR FILE_SHARE_READ,nil,CREATE_NEW OR OPEN_EXISTING,0,0);
        IF FFile = INVALID_HANDLE_VALUE then
        Begin
          MessageBox(0,'Device error',nil,0);
          Halt(1);
        end;
}

        // subst auf das Pipe legen - funzt gut
        IF not DefineDosDevice(0,'V:','\\.\pipe\Test'THEN
        Begin
          MessageBox(0,'DosDevice error',nil,0);
          Halt(1);
        end;
  end;

  destructor TTestThread.Destroy;
  Begin
    // Laufwerk löschen
    DefineDosDevice(DDD_REMOVE_DEFINITION,'V:',nil);

    CloseHandle(FFile);
    CloseHandle(FEvent);

    IF DisconnectNamedPipe(FNamedPipe) THEN
      CloseHandle(FNamedPipe);

    inherited;
  end;

  procedure TTestThread.Execute;
  var Buff : Cardinal; //array[0..4095] of Char;
      Size : Cardinal;
  Begin
    while not Terminated do
    Begin
      begin

        // Nachtricht erhalten 
        if ConnectNamedPipe(FNamedPipe,nilthen
        Begin
          // Nachricht lesen  
          ReadFile(FNamedPipe,Buff,SizeOf(Buff),Size,nil);
          //
          Res := Buff;
          WriteFile( FNamedPipe,Buff,SizeOf(Buff),Size,nil);

          FlushFileBuffers(FNamedPipe);
          DisconnectNamedPipe(FNamedPipe);

          Synchronize(ShowMsg);
//          CloseHandle(FNamedPipe);
//          CloseHandle(FFile);
//          CloseHandle(FEvent);
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Do 15.09.05 14:18 
user profile iconSteve1024 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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

:cry:
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Do 15.09.05 15:11 
Titel: Re: hmmm...
user profile iconSteve1024 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 Suche bei Google BART PE sowieso ein heisser tip (war übrigens auch bei der vorletzten c't auf cd und anleitung mit drauf)

user profile iconSteve1024 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 ? :gruebel:
user profile iconSteve1024 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:
user profile iconSteve1024 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 :lol:

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
Steve1024 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 16.09.05 11:57 
user profile iconSteve1024 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 (:mrgreen:) www.delphipraxis.net..._windowmessages.html

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
Steve1024 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 258

Win XP
D3 Prof., D7 Pe.
BeitragVerfasst: Mo 12.06.06 13:37 
Also ich würd auch zu BartPE raten.
Da is schon ne RAMDISK drin :wink: , 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.