Deutsch
Forum

Datei im RAM erstellen

 
- Seite 1 -



Jac
de
Lad
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 anschließend 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
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
18.04.2008  
 



 
- Seite 1 -


string a&,0=Blub
 
19.04.2008  
 




Jac
de
Lad
Ich hab mir im MSDN die APIs angesehen, aber ich komme damit nicht klar. Hast du eventuell ein Minimalbeispiel?

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
19.04.2008  
 



Im Moment nicht - die pipeUnit raspelt vieles hin-und-her sodass diese kaum zeigt wie es einfach geht...
 
19.04.2008  
 




Jac
de
Lad
Das ist schlecht. Trotzdem danke, ich schau mich mal weiter um.
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
19.04.2008  
 




Frank
Abbing

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 anschließend 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#)
 
19.04.2008  
 



Stimmt, er brauchs ja garnicht prozessübergreifend, sei denn die DLL läuft in einem anderen Prozess...
 
20.04.2008  
 




Andreas
Miethe


Frank Abbing
Frank Abbing
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 anschließend 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 !
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
20.04.2008  
 




Frank
Abbing

Bitte berichtige mich wenn ich da falsch liege !


Du liegst da sicher nicht falsch. Die Sache mit dem Dateinamen habe ich bewußt 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 iFs Lösung vorzuziehen. Ich bin sicher, er liefert Jac noch einen kurzen Democode dazu.
 
20.04.2008  
 




Andreas
Miethe


Hallo Frank,

ist eine ganz andere Geschichte, wenn die Dll selbst geschrieben wird.
Davon gehe ich aber nicht aus.

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

Jac
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
20.04.2008  
 



 
- Seite 2 -



Jac
de
Lad
Nein, nein, nein.

Folgendes:

Eine DLL xyz benötigt für eine Operation einen Dateinamen (meinetwegen wird die Datei geladen und unter einem anderen Format wieder gespeichert). Ich erzeuge die Datei aber nur temporär, weil Profan die Datei x nur in einem anderen Format erzeugen kann. Ich will nun diese temporäre Datei umgehen, weil es mir zu langsam ist, dass die auf der Festplatte erstellt wird. Deswegen suche ich nach einer Möglichkeit, dass die Datei trotzdem erstellt wird, aber die Ausgabe in den RAM umgeleitet wird. Die Datei muss natürlich trotzdem unter einem Dateinamen ansprechbar sein, da sonst die DLL xyz nicht mehr geht.

Wisst ihr jetzt was ich meine?
Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
20.04.2008  
 




Sebastian
König
Jac
Nein, nein, nein.

Folgendes:

Eine DLL xyz benötigt für eine Operation einen Dateinamen (meinetwegen wird die Datei geladen und unter einem anderen Format wieder gespeichert). Ich erzeuge die Datei aber nur temporär, weil Profan die Datei x nur in einem anderen Format erzeugen kann. Ich will nun diese temporäre Datei umgehen, weil es mir zu langsam ist, dass die auf der Festplatte erstellt wird. Deswegen suche ich nach einer Möglichkeit, dass die Datei trotzdem erstellt wird, aber die Ausgabe in den RAM umgeleitet wird. Die Datei muss natürlich trotzdem unter einem Dateinamen ansprechbar sein, da sonst die DLL xyz nicht mehr geht.

Wisst ihr jetzt was ich meine?
Jac


Eine Möglichkeit, die mir gerade einfällt, wäre vielleicht CreateNamedPipe(). Solche Objekte bekommen einen Namen nach dem Schema \.pipepipename und lassen sich mit CreateFile() öffnen, sodass man sie höchstwahrscheinlich an die Funktion als via ihres Datei-Namens übergeben könnte. Das schwierige an der Sache ist allerdings, dass man sich in dem aufrufenden Prozess um das Beschreiben der Pipe kümmern muss - sehr schwierig, denn das ganze müsste parallel zu dem Funktionaufruf geschehen, also in einem eigenen Thread ablaufen (was mit Profan2Cpp wohl funktionieren würde). Leider habe ich im Moment extrem wenig Zeit, sodass ich kein Beispiel liefern kann, aber ich werde in den nächsten Tagen mal etwas ausprobieren...

Vielleicht hat aber jemand noch eine bessere, i.e. einfachere Idee...

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
20.04.2008  
 




Sebastian
König
So, hier ist jetzt mal ein Beispiel. Im Prinzip funktioniert es - jedenfalls bei mir. Die Prozedur TestProc ist ein Dummy für die DLL-Funktion: Sie öffnet die Datei über ihren Namen und liest den Inhalt, bis nichts mehr zum Lesen verfügbar ist. Leider liegt hier (höchstwahrscheinlich) auch die große Einschränkung des Konzepts: Das ganze funktioniert wohl nur, wenn das Lesen auf diese Art und Weise stattfindet und nicht irgendwie zunächst die Dateigröße ermittelt und dann alles auf einem gelesen wird. Einen Versuch ist aber vielleicht trotzdem Wert...
KompilierenMarkierenSeparieren
 $H Windows.ph
 $IFNDEF P2CPP
Cls
Print Der Code funktioniert leider nur mit Profan2Cpp - Sorry!
Print
Print Taste zum Beenden.
WaitKey
End
 $ENDIF
var pipe$ = \\.\pipe\sk-testpipe
var signal& = ~CreateEvent(0,0,0,0)
declare data#
dim data#,1024 * 100 100 KB
clear data#
Bereich füllen...
declare error&

proc WriteThreadProc

    parameters lpParams&
    P2CPP: <USE_EXTERNAL_ST>
    var pipe& = ~CreateNamedPipe(Addr(pipe$),~PIPE_ACCESS_OUTBOUND,~PIPE_TYPE_BYTE | ~PIPE_WAIT,1,1024,1024,500,0)

    if pipe& = ~INVALID_HANDLE_VALUE

        error& = ~GetLastError()
        ~SetEvent(signal&)
        ~ExitThread(1)

    endif

    ~SetEvent(signal&)
    ~ConnectNamedPipe(pipe&,0)
    var dwTotalAvail& = SizeOf(data#)
    var dwTotalWritten& = 0
    var dwWritten& = 0

    while dwTotalWritten& < dwTotalAvail&

        dwWritten& = 0
        ~WriteFile(pipe&,data# + dwTotalWritten&,1024,Addr(dwWritten&),0)
        dwTotalWritten& = dwTotalWritten& + dwWritten&
        ~Sleep(0)

    endwhile

    ~FlushFileBuffers(pipe&)
    ~DisconnectNamedPipe(pipe&)
    ~CloseHandle(pipe&)
    ~ExitThread(0)
    P2CPP: </USE_EXTERNAL_ST>

endproc

proc TestProc

    parameters filename$
    declare file&
    var file& = ~CreateFile(Addr(filename$),~GENERIC_READ,0,0,~OPEN_EXISTING,0,0)
    Color 12,15
    Print Datei-Handle:,file&

    if file& = ~INVALID_HANDLE_VALUE

        Print WinError$(error&)
        WaitKey
        End

    endif

    var dwTotalRead& = 0
    var dwRead& = 0
    declare buffer#
    dim buffer#,1024

    while ~ReadFile(file&,buffer#,1024,Addr(dwRead&),0)

        dwTotalRead& = dwTotalRead& + dwRead&
        dwRead& = 0

    endwhile

    ~CloseHandle(file&)
    Print Int(dwTotalRead&  1024),KB gelesen
    Print
    dispose buffer#

endproc

Cls
declare id&
var thread& = ~CreateThread(0,0,ProcAddr(WriteThreadProc,1),0,0,Addr(id&))
Print Thread-ID:,id&
Print Thread-Handle:,thread&
Print
~WaitForSingleObject(signal&,~INFINITE)
~CloseHandle(signal&)
TestProc pipe$
~CloseHandle(thread&)
dispose data#
Color 0,15
Print Taste zum Beenden.
WaitKey
End

HTH

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
21.04.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.017 Betrachtungen

Unbenanntvor 0 min.
Jörg Sellmeyer12.06.2018
Ernst12.05.2014

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie