Hex00 bringt mein Programm zum Absturz



  • Hi,

    habe folgendes Problem: Ich möchte eine Datei öffnen, alle Zeichen auslesen und diese dann an den Drucker schicken. Es funktioniert eigentlich alles. Eigentlich 🙂 denn wenn meine Datei ein hex00 also 0x00 beinhaltet, stürzt diese mit dem Debug - Fenster ab. Ich vermude das es an der for - Schleife mit dem Befehl CString.GetAt(n) liegt.

    Kann mir jemand schnell helfen?
    Es ist leider sehr dringend.

    Danke schon mal.
    Hier ist der CODE:

    CFileDialog m_ldFile(TRUE,NULL,NULL,NULL,
    "Textdateien (.txt)|.txt|Alle Dateien (.)|.||");

    UpdateData(TRUE);
    // Dialogfeld Öffnen zeigen und Ergebnis auffangen
    if (m_ldFile.DoModal() == IDOK)
    {
    // Gewählten Dateinamen inkl. Pfad ermitteln
    m_Selection = m_ldFile.GetPathName();
    UpdateData(FALSE);
    //Datei öffnen
    CFile f( m_ldFile.GetFileName(),
    CFile::modeRead | CFile::typeBinary);

    int nFileSize = f.GetLength();
    LPSTR pchBuffer = new char[nFileSize];

    //Datei-Inhalt einlesen
    f.ReadString(pchBuffer,nFileSize);
    pchBuffer::Replace(0x00,0x00);

    //Variablendefinition
    CString strBuf;
    strBuf = pchBuffer;
    strBuf = strBuf.Left(nFileSize);
    delete pchBuffer;

    //Datei schließen
    f.Close();

    char back;
    //Datei-Byte->Byte an den Drucker senden
    for(int n=0;n<nFileSize;n++)
    {
    //MessageBox(_T("SENDE-Routine"));
    back=strBuf.GetAt(n);
    SetPortByte(HwCtrl,GetLPTBasePort(HwCtrl),back);
    LPTStrobe(HwCtrl);
    }

    😕



  • Auf die schelle habe ich keine Zeit genauer auf den Quellcode einzugehen. Eins kann ich jedenfalls sagen: es kann gar nicht funktionieren, weil 0x00 String-Ende bedeutet. Ich fürchte, Du mußt mit einem Byte-Array arbeiten.



  • Nimm das hier doch erstmal raus "pchBuffer::Replace(0x00,0x00);". Zum einen macht es keinen Sinn, und zum anderen kann es sein, dass dies an deinem Problem schuld ist. Ich könnte mir vorstellen, dass diese Stelle der Replace-Routine den Garaus macht...



  • Hi,

    RE:MaSTaH - Danke aber das liegt ganz sicher nicht am Replace... Ich habe Replace erst eingebaut, als ich keine andere Lösung gefunden habe. Trotzdem Danke

    RE: Echolon - Danke, genau das ist das Problem!!! Ich weiß aber nicht wie ich das ganze in ein Byte einlesen soll und dann Stück für Stück bzw. Byte für Byte auszugeben. Kannst du mir bitte helfen???

    Danke Euch beiden... 🙂



  • Was macht es überhaupt für einen Sinn, dass du die Datei binär öffnest und dann Strings ausliest (ReadString)... Benutze doch einfach mal Read anstatt ReadString...

    So liest du ein Kilobyte aus.

    BYTE bytes[1024];
    f.Read(&bytes, 1024);
    

    So liest du ein einzelnes Byte aus.

    BYTE byte;
    f.Read(&byte, 1024);
    


  • Hallo,

    warum benutzt du keinen CString. Dann bist du hinsichtlich Speicherproblemen und Ende- Char auf der sicheren Seite.

    Was macht Replace an dieser Stelle überhaupt???

    Grüße, Volle.



  • Also, anscheinend ist das Problem noch nicht so deutlich geworden:

    Vergesst doch bitte das Replace!!! Es ist schon längst RAUS!!!

    Die Vorgehensweise:

    Ich wähle eine Datei aus, und jetzt soll über einen LPSTR alles entsprechend der Größe der Datei ausgelesen werden. Bis jetzt ist alles ok!!!
    JETZT kommt aber der Knackpunkt. Nun muss eine Schleife laufen in der immer das nächste Zeichen aus dem LPSTR gelesen und als UCHAR an den Drucker gesendet werden!!!

    Wie kann ich ohne einen String einzusetzten das bewerkstelligen???

    Danke an alle dir mir helfen möchten



  • Warum Möchtest du eigentlich 0x00 auf den Drucker Ausgeben?
    eigentlich sollte dabei kein zeichen gedruckt werden, Weshalb Läßt du die 0x00 einfach weg oder sendest an dessen stelle eine " " (Leerzeichen?).
    Somit sollte dein programm nicht mehr abstürzen.

    Was genau möchtest du den Drucken oder wolltest du nur daten ober den Druckerport übermitteln ( z.B Laplink)?



  • Hallo ldr-alpha,

    ich möchte die Schnittstelle einfach öffnen, eine Datei mit dem vollen Zeichsatz zum Drucker senden und diese einfach drucken lassen. Zum Beispiel ein Domkument unter MsWord in eine Datei drucken zu lassen (*.prn) und diese dann einfach zum Drucker senden. Da Word alles als Grafik verarbeitet, habe ich auch Hex00 als Inhalt was mein Programm zum Absturz bringt. Wenn ich aber die prn-Datei direkt über copy /b zum Drucker schicke, dann kommt mein Dokument richtig raus - nicht aber über mein Programm...



  • Hi,

    ich würde dir aber trotz allem zu einem CString raten. Nimm ein CStdioFile, lese deine ganze Datei in den CString und nimm dann char für char (myCString[1] oder myCString.GetAt(1)) und sende sie an den Drucker.

    So wie z.B. hier beschrieben...

    Damit sollte auch nix abstürzen.

    Grüße, Volle.



  • Danke Volle, aber mein Problem löst sich nicht durch ein CString!!! Verstehst mich anscheinend nicht 😞

    dennoch Danke



  • Ich habe herausgefunden das es an dem strBuf.GetAt(n) handelt. Und zwar sieht man das an der Funktionsdefinition von GetAt im Debug - Modus! Dort wird auf Hex00 bzw. NULL geprüft.

    Kennt einer eine Möglichkeit diesen Wert nur für mein Programm neu zu definieren? Evtl. über ASSERT?!?

    Thanx



  • @Volle
    Man sollte mit der Verwendung von CString beim Auslesen von Dateien vorsichtig sein (Wenn es keine Textdateien sind). Ganz sicher benutzt man ihn nicht nicht bei binären Dateien, da auch ein CString eine abschließende 0 hat und du nur Probleme bekommen würdest (z.B. es werden nur die ersten 12 Bytes eingelesen weil dann eine 0 kommt)... Hier geht es soweit ich verstanden habe nicht darum eine Textdatei zu drucken (Das würdest du eher über einen CDC machen) sondern eine Datei-Druckausgabe (Ich glaub das ist dann Postscript oder so) an einen Drucker zu schicken.

    @S.Kirr
    Frage1: Warum druckst du nicht sofort sondern mit dem Umweg über eine Datei???
    Frage2: Warum steht dein FileDlg auf dem Typ txt???
    Frage3: Bist du dir im klaren was du überhaupt machen willst???
    Frage4: Wäre ein anderes Thema zum lernen nicht einfacher???

    BTW: ICh glaube nicht, dass es damit getan ist die Datei an den LPT zu senden. Der braucht bestimmt vorher einige Instruktionen, damit er weiß: Jetzt kommt eine Datei... 😉



  • Original erstellt von S.Kirr:
    **Ich habe herausgefunden das es an dem strBuf.GetAt(n) handelt. Und zwar sieht man das an der Funktionsdefinition von GetAt im Debug - Modus! Dort wird auf Hex00 bzw. NULL geprüft.

    Kennt einer eine Möglichkeit diesen Wert nur für mein Programm neu zu definieren? Evtl. über ASSERT?!?

    Thanx**

    ASSERT ist nur zur Warnung da. Der Debugger warnt also wenn eine binäre 0 kommt. Das macht er nicht ohne Grund, also würde ich in dem Code nicht rumfummeln... Du kannst ein ASSERT immer ignorieren...

    EDIT: Was nicht unbedingt heißen soll dass das sinnvoll ist... 😉 . Schreib ich schon bevor wieder einer anfängt zu meckern dass ich empfehle Assertiations zu ignorieren... 😃 (Was ich sicher nicht mache)

    [ Dieser Beitrag wurde am 10.02.2003 um 18:06 Uhr von MaSTaH editiert. ]



  • Hallo S.Kirr,

    @Mastah: Ja, das hatte ich überlesen. Ich dachte es geht um TextFiles.

    Aber dann bleibe ich trotz allem bei einem CFile und meinetwegen einem CArray. Damit hat man wenigstens für den Anfang keine Probleme mit Schutzverletzungen.

    Grüße, Volle.



  • Hi,

    @MaSTaH : Die Druckroutine ist in Ordnung, wie gesagt wenn ich Dateien ohne Hex00 zum Drucker schicke funktioniert alles wie gewünscht!

    Das mit CArray werde ich probieren.

    THanx an alle


Anmelden zum Antworten