Datei im RAM erstellen



Datei im RAM erstellen

Jac, 18.04.2008 22:06: Hallo Community!
Mit der API "CreateFile" kann man jede Menge verschiedener Dateien erstellen. Ich suche eine Möglichkeit eine Datei quasi im RAM zu erstellen um dann mittels einer DLL-Funktion darauf zuzugreifen, etwas damit zu machen und die Datei anschliessend wieder zu löschen. Damit würde ich eine temporäre Datei umgeben, was erstens schneller ist und zweitens einfach schöner. Kennt sich jemand damit aus? Ich komme mit der Hilfe nicht klar, es gibt das etliche Parameter mit hunderten Möglichkeiten...
Jac


David Strutz, 18.04.2008 22:39: Ja, das ist in etwa das was die pipe-unit macht.

' XPSE-Quelltext erkannt.C-Style (XPSE) 

//create
h&=external("kernel32","CreateFileMappingA",$FFFFFFFF,0,4,0,32767,addr(nam$))
a&=external("kernel32","MapViewOfFile",h&,2,0,0,32767)
//close
external("kernel32","UnmapViewOfFile",a&)
external("kernel32","CloseHandle",h&)


Jac, 18.04.2008 22:48: Aber wie kann ich die "Datei" nutzen, wenn die Funktion der DLL einen Zeiger auf einen Dateinamen benötigt?
Jac


David Strutz, 19.04.2008 16:16: string a&,0="Blub"


Jac, 19.04.2008 17:25: Ich hab mir im MSDN die APIs angesehen, aber ich komme damit nicht klar. Hast du eventuell ein Minimalbeispiel?
Jac


David Strutz, 19.04.2008 17:39: Im Moment nicht - die pipeUnit raspelt vieles hin-und-her sodass diese kaum zeigt wie es "einfach" geht...


Jac, 19.04.2008 19:12: Das ist schlecht. Trotzdem danke, ich schau mich mal weiter um.


Frank Abbing, 19.04.2008 21:25:   Zitat: „Ich suche eine Möglichkeit eine Datei quasi im RAM zu erstellen um dann mittels einer DLL-Funktion darauf zuzugreifen, etwas damit zu machen und die Datei anschliessend wieder zu löschen.
Hört sich für mich an wie ein stinknormaler Speicherbereich. Übergib einfach einen Zeiger auf den Speicher an die Dll-Funktion, z.B. NeueFunktion(bereich#)


David Strutz, 20.04.2008 02:15: Stimmt, er brauch's ja garnicht prozessübergreifend, sei denn die DLL läuft in einem anderen Prozess...


Andreas M., 20.04.2008 11:41:   Zitat von ""Frank Abbing"": „
  Zitat: „Ich suche eine Möglichkeit eine Datei quasi im RAM zu erstellen um dann mittels einer DLL-Funktion darauf zuzugreifen, etwas damit zu machen und die Datei anschliessend wieder zu löschen.
Hört sich für mich an wie ein stinknormaler Speicherbereich. Übergib einfach einen Zeiger auf den Speicher an die Dll-Funktion, z.B. NeueFunktion(bereich#)

Wird nicht funktionieren !
So wie ich das verstanden habe, soll eine Datei, die nur im Ram liegt, mit einem Dateinamen angesprochen werden.
Beispiel:
Eine EXE wird mittels Datengenerator in die Exe eingebunden.
Da habe ich meine EXE im Speicherbereich.
Jetzt versuch mal mit der Kernel32.Dll per CreateProcess() das Ding zum Laufen zu kriegen.
Da wird kein Speicherbereich sondern ein Dateiname erwartet.
Immer wenn eine Dll-Funktion einen Zeiger auf einen Dateinamen erwartet, und davon gibt es eine Menge, wird das so nicht funktionieren.
Bitte berichtige mich wenn ich da falsch liege !


Frank Abbing, 20.04.2008 14:05:   Zitat: „Bitte berichtige mich wenn ich da falsch liege !
Du liegst da sicher nicht falsch. Die Sache mit dem Dateinamen habe ich bewusst aussen vor gehalten, weil ich davon ausgegangen war, dass Jac die Dll selber erzeugt. Dafür fand ich die Technik über die Bereiche viel sinnvoller. Das geht aber mit einer fremden Dll nicht.
Aber ich bin sicher, dass auch eine Exedatei aus dem Speicher gestartet werden kann. Immerhin geht das ja auch mit Dlls (Memorymodule) und diese sind ja auch Exedateien.
Wie auch immer, alles in Allem ist iF's Lösung vorzuziehen. Ich bin sicher, er liefert Jac noch einen kurzen Democode dazu.


Andreas M., 20.04.2008 15:08: Hallo Frank,
ist eine ganz andere Geschichte, wenn die Dll selbst geschrieben wird.
Davon gehe ich aber nicht aus.
  Zitat von ""Jac"": „Aber wie kann ich die "Datei" nutzen, wenn die Funktion der DLL einen Zeiger auf einen Dateinamen benötigt?
Jac


Dies ist die Offlinevariante vom Thread [Datei im RAM erstellen].

Valid CSS!

©2006 XProfan.Com