[VB6 SP6] Fehler: Nicht genügend Speicher

  • VB6

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Unknown.

    [VB6 SP6] Fehler: Nicht genügend Speicher

    Mein Visual Basic 6.0 Projekt (Service Pack 6.0 ist installiert), erzeugt zur Laufzeit die Fehlermeldung "Nicht genügend Speicher".

    Da dieser Fehler nicht bei mir auftritt, sondern bei einem anderen User, kann ich nicht debuggen, da der andere User keinen Quelltext hat und diesen auch nicht bekommt. Demnach kann ich keinen genauen Quellcode posten, da ich ja nicht weiß, welchen ich posten soll (es ist ein großer Quellcode).

    Der Fehler muss damit zu tun haben, dass eine Textdatei, welche über 2 MB groß ist, geöffnet / gelesen / erweitert / gespeichert wird. Das ganze mache ich mit einem FileSystemObject.

    Die Stelle, an der der Fehler auftritt, könnte evtl. diese sein:

    Visual Basic-Quellcode

    1. Set stream2 = fso.OpenTextFile(topicbackup_file, ForAppending, True, TristateUseDefault)
    2. For i2 = LBound(topic_array()) To UBound(topic_array())
    3. ReplaceBreaks topic_array(i2)
    4. stream2.Write topic_array(i2)
    5. stream2.Write vbCrLf
    6. Next i2
    7. incTopicID = incTopicID + 1
    8. MaxTopicID = incTopicID
    9. stream2.Write CStr(incTopicID)
    10. stream2.Write vbCrLf
    11. stream2.Close
    12. Set stream2 = Nothing


    Hat jemand nur den Hauch einer Idee, warum diese Fehlermeldung kommen könnte? Der PC, auf dem die Meldung kommt, nutzt Windows XP SP2 und hat 2 GB RAM.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Da kann ich nur raten, vielleicht unterstützt fso.OpenTextFile nur Dateien unter 2 MB, oder der andere User hat noch andere systemresourcenfressende Programme am laufen gehabt, oder da ist mal wieder ein Windowsbug zum vorschein gekommen, wer weiß das schon so genau ;)
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Nicht genügend Speicher

    Was ist damit überhaupt gemeint?
    Arbeits-,Stapel-,Festplatten-,...

    Die Fehlermeldung ist ziemlich allgemein gehalten, wenn die so original ist.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Sie ist so original. Genau weiß ich es auch nicht, welcher Speicher gemeint ist, aber ich nehme an, dass RAM gemeint ist.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Es könnte aber auch die festplatte gemeint sein, weil du ja hier an einer Datei etwas anhängst. Oder was bedeutet "ForApending"?
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    ForAppending bedeutet, dass man in die Datei schreiben kann (bzw. was anhängen kann). Aber ich glaube kaum, dass die Festplatte des Users voll war.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Kann ja sein das er mehrere Patitionen hat und eine davon ist halt schon ziemlich ausgelastet.

    Kann er dir nicht einfach die Datei zusenden und du probierst es bei dir mit debuggen? Weil so blind rum raten bringts ja auch nicht unbedingt...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Ich habe die Datei. Ich habe damit zwar noch nichts getestet, aber der Fehler kann bei mir eigentlich garnicht auftreten, da ich selbst schon eine Datei mit 6 MB Größe mit dem selben Programm bearbeitet habe (d.h. mit dem selben Quellcode).
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hi,

    die Fehlermeldung: "Nicht genügend Speicher." meint (meistens!) den RAM.

    Ich habe unter Win 98 auch Probleme mit zuwenig RAM, da dort nur der unter 1 MB genutzt wird (wie zu alten DOS Zeiten.)
    Läuft das Programm evtl. im Kompatibilitätsmodus ???

    Sind in der Datei irgendwelche Sonderzeichen die er nicht verträgt ???

    Ist evtl. das FSO im SP2 von XP fehlerhaft oder beim installieren irgendwas schief gelaufen ???

    Evtl. hilft es ja, das Programm zu deinstallieren und dann nochmal neu zu installieren. Auch dort könnte bei der Installation was schief gelaufen sein.


    bye ...

    LaMa5.
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de
    Ich habe eben mal die Datei des Users bei mir geöffnet und wie zu erwarten trat dabei kein Fehler auf.

    Da ich auch WinXP SP2 benutze, kann das FSO dort nicht fehlerhaft sein. Sonderzeichen sind dort vielleicht drin, aber ich lese die Datei doch nicht, sondern will nur am Ende was dranhängen. Oder liest er die Datei dann immer komplett ein?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hi,

    wie ist denn das System von dem Anwender beschaffen ??? Was sind dort für Anwendungen drauf ??? Evtl. hat ja eine andere Anwendung das FSO durch ein älteres ersetzt, dass irgendeinen Befehl nicht verarbeiten kann oder einen Bug hat oder nicht mit großen Files umgehen kann oder ... .

    Ist auch nur so eine Idee, die mir grade durch den Kopf schoss.


    bye ...

    LaMa5.

    Edit:
    Was passiert bei dem Anwender mit kleineren Dateien ??? Funktioniert es da ???
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    Ja, mit kleineren Dateien geht es. Es funktionierte auch mit Dateien, die ein paar KB größer sind, als die "Fehlerdatei". Ich habe jetzt für den User mal eine Debug-EXE kompiliert, die bei Fehlern auch die Zeilennummer ausgibt. Vielleicht bringt mich das weiter.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Oder liest er die Datei dann immer komplett ein?


    Nein, das Öffnen einer Datei erzeugt nur ein Zugriffshandle. Von Lesen / Schreiben ist an der Stelle noch keine Rede, das kommt erst mit direktem Befehl.

    Es funktionierte auch mit Dateien, die ein paar KB größer sind, als die "Fehlerdatei".


    Das verwirrt mich komplett, ein echtes Phänomän. *amKopfkratz*
    Ich habe für den entsprechenden User eine Version mit Zeilennummern kompiliert und eine etwas genauere Fehlermeldung ausgegeben. Nun habe ich herausgefunden, dass der Fehler hier liegt:

    Visual Basic-Quellcode

    1. 1870 topics = ByteArrayToStr(btopics) ' <= Hier der Fehler Nr. 7: Zu wenig Speicher
    2. '---------------------------------------------------------------------------
    3. Public Function ByteArrayToStr(b() As Byte) As String
    4. ' Wandelt ein Byte-Array in einen String um
    5. ByteArrayToStr = Replace$(StrConv(b, vbUnicode), vbNullChar, vbNullString)
    6. End Function


    "topics" ist ein String, "btopics" ein ByteArray.

    Hat jemand eine Idee, was der Fehler sein kann?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    b ist wie folgt deklariert:

    Visual Basic-Quellcode

    1. dim b() as byte


    Edit:
    b wird so gefüllt: b() = Inet1.OpenUrl('...', icByteArray)

    Inet1 ist ein Microsoft Internet Transfer Control.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Dann dürften nur in b(0) Daten vorhanden sein, die Du in einen String umwandeln kannst. b(1) oder höher sollte leer sein, vielleicht kannst Du in der Function ByteArrayToStr() erst abfragen, ob b(x) ungleich 0 ist.

    Einen anderen Lösungsansatz wüsste ich nicht, dann bin ich mit meinem kleinen Latinum am Ende.
    @Pascal:
    Wie kommst du darauf, dass nur das 1. Element (Index 0)
    gültige Daten enthält ? Dann wäre die Darstellung von
    mehreren Zeichen doch gar nicht möglich.

    @Marcus Gräfe:
    Ich hätte zwei Möglichkeiten, warum der Fehler auftritt,
    beide hängen mit der StrConv-Funktion zusammen.
    Erst einmal könnte es sein, dass ein Problem mit
    Unicode-Zeichenfolgen beim User vorhanden ist. Die Konstante
    vbUnicode lässt die Funktion nämlich Voreinstellungen
    aus dem System übernehmen. Das würde auch erklären,
    warum der Fehler bei dir nicht auftritt.
    Der zweite Grund könnte mit dieser Bemerkung aus
    der MSDN zur StrConv-Funktion zusammenhängen:


    MSDN:
    Bemerkungen

    Wenn Sie von einem Byte-Datenfeld in ANSI-Format
    in eine Zeichenfolge konvertieren, sollten Sie die
    Funktion StrConv verwenden. Wenn Sie von einem
    solchen Datenfeld in Unicode-Format umwandeln,
    verwenden Sie eine Zuweisungsanweisung.


    Um den Fehler noch mehr einzuschränken würde ich
    an deiner Stelle die StrConv und Replace Funktion
    nochmal aufteilen um zu überprüfen, welche der
    beiden Funktionen den Fehler auslöst.

    Außerdem frage ich mich warum du überhaupt erst ein
    Byte-Array bei der OpenUrl Funktion verwendest,
    wo du doch gleich einen String hättest nehmen können.
    Und ob du zwingend eine Konvertierung ins Unicode
    Format durchführen musst mit der Funktion StrConv.
    Ich glaube nämlich, dass es eine einfache Zuweisung
    (ByteArrayToStr = b() ) auch tun würde.