Ressource auslesen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

  • Hallo,
    ich hab folgendes Problem: Ich hab eine Datei als Ressource in eine Exe integriert. Dazu habe ich folgenden Code verwendet, der auch wunderbar funktioniert:


    Code
    cls
    Var String Datei   = "D:/XProfan/Projekte/OSU-Tool/GetPlans.script"
    Var String ResDLL  = "D:/XProfan/Projekte/OSU-Tool/PrfRun32.exe"
    Print Res("Load", ResDLL, "Script", "GetPlans", Datei)
    Var Handle hDLL = UseDLL(ResDLL)
    print res("save", hDLL, "Script", "GetPlans", "getplans.script")
    FreeDLL hDLL
    Print "Taste drücken ..."
    waitinput

    Wie kann ich meine Ressource (ein Script) wieder einlesen, am besten in einen String oder Bereich?

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Hier mal ein einfaches Beispiel, das eine Profan - interne Stringressource
    ausliest.

    Kannst du dann mit deiner Resource ersetzen (2. Parameter von Res("GetStrings",...)).
    Statt ausprinten, dann halt einfach mit den Move-Befehlen das Array in die Listboxliste
    und wieder mit Move(….) in einen String oder Bereich schieben.
    Dran denken, zwischendurch die interne Listboxliste wieder zu löschen.


  • Was mache ich wenn die Ressource in einer EXE-Datei liegt, die nicht meine Runtime ist? Eine DLL kann ich mittels UseDLL laden, aber eine EXE?

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Bzw. es klappt nicht, vermutlich weil meine Ressource als "SCRIPT" gekennzeichnet ist. Ich weiß aber 1. nicht wie ich einen String als Ressource hinzufüge und 2. der "String" ist ja eine komplette Datei mit Umbrüchen und \q und so weiter.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Ist das eine fremde .exe, also nicht mit Profan erstellt ?
    Ganze Dateien habe ich immer gerne mit dem ResHacker
    in die Runtime eingebunden.


    Wie die Ressource heißt, ist ja gleichgültig. Sie muß nur
    mit dem richtigen Resourcentyp (STRING) hinzu gefügt
    werden.

  • Nein, die XProfan-Runtime an die das Compilat angehängt ist. Ich habe SCRIPT gewählt, da ändere ich das mal in STRING um.


    Danke.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Das sollte für alle Eventualitäten genügen, egal, ob (eigene) EXE oder DLL:



    Gruß Matthias

    Matthias Arlt
    WinXP SP2/Win7 - XProfan 10/11/FreeProfan32 - Xpia

    Einmal editiert, zuletzt von MaZz ()

  • Ah danke.


    Tut mir leid wegen der vielen Fragen, außer mit Icons habe ich noch nicht mit Ressourcen gearbeitet. Wie kann ich meine Textdatei in die Exe einbauen um sie dann wieder in einen Bereich auszulesen? ResHacker hilft nur bedingt und ich will eigentlich kein String-Array haben, sondern einen String.


    Beispiel: Folgende Datei soll als Ressource in meiner Exe vorliegen und bei Bedarf ausgelesen und anschließend manipuliert, gespeichert und ausgeführt werden:

    Code
    rem @echo off
    <entry1>
    cd <entry2>
    j:\viscom\prg\perl\bin\perl.exe <entry3>\Script.tmp
    del fujiflexa.txt
    del *.bl
    del *.co
    del *.hex

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Soll die Datei nur einmalig in die .exe rein oder soll sie
    nach der Ausführung bzw. Manipulation wieder erneut
    als Ressource gespeichert werden ?


    Ist halt problematisch, in einem laufenden Prozess (Programm)
    eine Ressource neu zu platzieren.


    PS:
    Schau mal in der Hilfe nach ProgEnd.
    Evtl. kann man damit auch was anfangen.

  • Nur dinmalig und ich will sie nicht in den Quelltext integrieren.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Geht doch super mit dem ResHacker ;-)
    - Öffne die Prfrun32.exe mit dem ResHacker
    - Gehe zur Sektion RCDATA
    - Gehe im Menü zu Aktionen und neue Ressouce hinzufügen
    - wähle deine Textdatei
    - Als Typ RCDATA eingeben
    - Name vergeben (hier habe ich ZEILEN genommen)
    - Sprache leer lassen (kann 0 bleiben)


    ResHacker liest die Datei ein. Anschließend wieder die Prfrun32.exe speichern und fertig.


    Anbei ein kleiner Code, wie du das wieder ausliest :

    Hier mal einfach in ein MultiEdit.
    Einfach exe erzeugen und starten. Wenn du Im interpreter ausführst, müßtest du die
    Profan.exe entsprechend manipulieren.

  • Ah danke. Probiere ich nächste Woche aus. Vielen Dank. Manchmal bin ich etwas Brettern, aber das ist jetzt so schön vorgekaut, das klappt mit Sicherheit.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Ah, vielen Dank. Das hat sehr gut geklappt. Aber was mache ich um die Größe der Ressource zu ermitteln? Ich weiß ja eventuell nicht wie groß die Datei mal war.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Schau dir mal den von Roland eingebauten Container RES an.
    Da gibt es auch ein
    Res("Size", N1, N2)


    Das wäre dann so was :


    Code
    MessageBox(Str$(Res("Size", %HInstance, erg)), "Größe", 0)


    Um die Bereichsvariable 'Bereich' groß genug zu DIMen, könnte man die
    Proc etwas umstellen :


    Code
    Proc LeseRessource
    Declare Long erg, Memory Bereich
    erg = Res("Info", %HInstance, 10, "ZEILEN", 0)
    Dim Bereich, Res("Size", %HInstance, erg)
    Bereich = Res("Get", %HInstance, erg)
    Move("MemToList", Bereich, Chr$(13) + Chr$(10))
    Move("ListToHandle", medit)
    MessageBox(Str$(Res("Size", %HInstance, erg)), "Größe", 0)
    Dispose Bereich
    EndProc

    Ich hoffe, das hilft dir.


  • Ah danke. Kommt mir alles sehr umständlich vor, aber wenn's einmal in ner proc ist geht's ja.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Klappt. Aber gibt es eine Art Beschränkung? Eine meiner Textdateien ist ca. 55kB groß, die ist brav in der Runtime, nach dem Compilieren ist sie aber weg.

    XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
    Ryzen 5800X/Gigabyte B550m DS3H/32GB RAM@3600MHz/Radeon HD7770 OC/Asus Xonar SE/108TB HDD+512GB Samsung 980 Pro+2TB Crucial SSD/28" Samsung 4k
    TerraMaster F4-421 mit 28TB
    XBox Classic/360S/Series X/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
    OnePlus 6 8GB/256GB
    jacdelad.bplaced.net

  • Das kann durchaus sein, daß da ein Limit bei RCDATA ist.
    Such mal in der Hilfe nach 'Res('. Da steht bei Res("AddStrings", ..)




    Versuch doch mal ein eigenes Programm zu machen, das mit
    res("AddStrings", D, S, N, S[]) die Prfrun32.exe mit der Datei füttert.


    Mit den Move-Funktionen kannst du ja schön alles einladen :
    Move("FileToList", Datei$) liest dir die Datei ja in die Listboxliste
    und mit Move("ListToArr", A[]) hast du ja schnell das Array für
    Res("Addstrings",..) gefüllt.


    Mit Res("GetStrings",...) bekommst du ja dein Array (im normalen
    Programm) gefüllt.
    Den Inhalt des Arrays kannst du ja nach deinen Bedürfnissen
    hin - Moven, wo du willst, indem du die int. Listboxliste als
    Zwischenspeicher mißbrauchst.


    Vielleicht kommen wir damit weiter.

  • Ich kann jetzt nur von echten Resourcen sprechen, die besonderheiten in XProfan sind mir nicht bekannt.
    Eine RCDATA-Resource muss am Ende durch 4 teilbar sein, d.h. es sind genau so viele 0 Byte Dateien anzuhängen, das dies zutrifft, sonst gibt es Probleme mit der nächsten Resource!