Announcement

Collapse
No announcement yet.

Probleme mit WIN32 Programm unter Windows 95

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit WIN32 Programm unter Windows 95

    Mein Berechnungsprogramm, das ich jetzt auf 32bit umgestellt habe, läuft zwar unter NT, aber noch nicht unter WIN95. Es kommt zu einer Schutzverletzung. Ich gehe mal davon aus, daß das WIN95-System noch korrekt gearbeitet hat und der Fehler in meinem Programm liegt.

    Gibt es außer GetCommandLine, _argc und _argv noch weitere Punkte, bei denen man zwischen WIN95 und WINNT unterscheiden muß ?

    Sollte ich mir als zweites Betriebssystem WIN95 mit Borland C++ installieren, oder gibt es andere Möglichkeiten, solche Schutzverletzungen einzukreisen ?

    Danke - Günther
    Günther

  • #2
    Hallo Günther,

    leider gibt es eine ganze Menge. Deshalb noch Fragen:
    Startet Dein Programm überhaupt nicht ?
    Kannst Du durch schrittweises Ausführen mit dem Debugger die Stelle einkreisen ?
    Ein etwas zeitraubender aber sicher erfolgreicher Weg wäre, dass Du alle Systemaufrufe in der WIN32 SDK Hilfe überprüfst, ob diese auch so unter WIN32s oder WIN95 vorhanden sind.

    Mfg
    Gerhar

    Comment


    • #3
      Hallo Gerhard, Das Problem ist ja, daß mir kein WIN95 mit installiertem BC5 zur Verfügung steht. So wie es aussieht, kann ich aber kurzfristig eine gebrauchte Festplatte bekommen, dann installiere ich mir auf meinem Privat-PC WIN95 und NT parallel. Oder ich leih mir ein NoteBook oder einen xbeliebigen PC für ein paar Tage aus. Ein Problem ist ja auch, daß der Chef meine Quelltexte als wohlgehütetes Geheimrezept betrachtet. Da kann ich nicht einfach den Rechner eines Kollegen mitbenutzen.

      Bei Schutzverletzungen ist es in der Regel so, daß der Debugger dann schon auf die richtige Quelltextstelle zeigt. Die Schutzverletzung tritt innerhalb der Initialisierungsroutinen vor der Fenstererzeugung auf, und das ist eigentlich eine ganze Menge, was da abläuft. Allerdings sind direkte Windowsaufrufe da eher selten. Hilft eigentlich die Meldung ...an Adresse XXXX:XXXX in Modul YYYY.YYY dabei weiter ? Gruß: Günthe
      Günther

      Comment


      • #4
        Hallo Günther,

        tut mir leid, aber ich denke der schnellste und einfachste Weg ist wirklich WIN95 zu installieren und dann zu debuggen.
        Der Hinweis an Adresse XXXX:XXXX in Modul YYYY.YYY hat zumindest mir nur sehr selten genützt.

        Sorry und beste Grüße
        Gerhard

        P.S. Es würde mich sehr interresieren was die Ursachen sind, da ich auch öfters mit Programmentwicklung unter NT und WIN... zu tun habe

        Comment


        • #5
          Hallo Gerhard.

          Ich hab jetzt mal in meinen Büchern recherchiert und in die API-Hilfe geschaut. Nirgendwo finde ich einen Hinweis, daß GetCommandLine NT-only ist. Immer werden alle WIN32 Systeme als geeignet erklärt. Werde es morgen früh sofort testen. Woher hattest Du die denn die Information, daß es da Unterschiede gibt ?

          In einem Buch habe ich gelesen, daß man regelmäßig auf beiden Systemen testen soll. Und weil wir in der Firma bald nur noch NT haben, ist die Parallelinstallation auf meinem Privat-PC jetzt beschlossene Sache.

          Günthe
          Günther

          Comment


          • #6
            Hallo Günther,

            da habe ich mich vielleicht falsch ausgdrückt. GetCommandLine ist für alle WIN32-Systeme verfügbar. Nur bei Windows NT mußt Du eben parsen und bei WIN32s (exact eigentlich auf Nicht-UniCode-Anwendungen) kannst Du auf die Kommandozeilenparameter durch argc und argv.. zugreifen, was den Programmieraufwand natürlich veringert. In der WIN32 SDK steht dazu folgendes:
            The GetCommandLine function returns a pointer to the command-line string for the current process.
            Remarks

            Non-Unicode console processes written in C can use the argc and argv arguments to access the command-line arguments. The parameters of the command-line string, excluding the program name, are also available to such non-Unicode applications as a parameter of the WinMain function. The reason for the Unicode exclusion from these options is that WinMain, argc, and argv use the LPSTR data type for parameters, not the LPTSTR datatype.

            Mfg Gerhar

            Comment


            • #7
              <html>

              <head>
              <meta http-equiv="Content-Type"
              content="text/html; charset=iso-8859-1">
              <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
              <title>Normale Seite ohne Titel</title>
              </head>

              <body bgcolor="#FFFFFF">

              <p>Hallo Gerhard </p>

              <p>Mein Kollege hat sich jetzt dazu aufraffen können, das
              Programm mal eben zu starten. Es funktioniert leider nicht. Werde
              wohl am Wochenende meinen Rechner plattmachen.</p>

              <p>Was ist &quot;parsen&quot; ? Ich kenne das Wort nicht und
              deute es so: GetCommandLine liefert in einem String: <strong>&quot;\&quot;K:\\Raja_cad\\RajaWin32.Exe\& quot;
              -a -b -c&quot;</strong> Mein Programm muß daraus seinen
              Programmpfad ermitteln: <strong>K:\Raja_cad</strong> und die 3
              Parameter <strong>-a -b</strong> und <strong>-c</strong>. Richtig
              ? </p>

              <p>Oder liegt es an der Betonung: bei Windows NT <em><strong><u>mußt</u></strong></em>
              Du eben parsen und bei WIN32s <em><strong><u>kannst</u></strong></em>
              Du ... Dann wäre &quot;parsen&quot; also die Sache mit dem
              OSVERSIONINFO.</p>

              <p>Aber Unicode verwende ich doch nicht, da müßte ich doch
              bewußt irgendeinen Schalter setzen und hätte auch Probleme,
              wenn ich verschlüsselte Texte aus Biärdateien lese und diese
              Byteweise dekodiere ? Oder sehe ich das falsch ? Im
              Inspektorfenster wird mir z.B. angegeben: [0] ' &quot; ' 34
              (0x22). Das ist doch kein Unicode !</p>

              <p>Auf jeden Fall bedanke ich mich für Deine geduldige Hilfe.</p>

              </body>
              </html&gt
              Günther

              Comment


              • #8
                Irgendwie hab ich da oben etwas konfus geschrieben, ich hoffe, man versteht, was ich meine. Ändern funktioniert nicht mehr
                Günther

                Comment


                • #9
                  Hallo Günther,

                  so wie du parsen beschreibst, ist es völlig Korrekt. Auch wenn Du kein UniCode verwendest, arbeitet NT intern nur mit UniCode. D.h., Systemaufrufe, die einen String erwarten oder zurückliefern, werden intern immer in UniCode übersetzt und wieder in die Codepage zurückübersetzt mit der Du arbeitest.
                  Ein anderes Bsp. wo WIN95/98 "moderner" ist als NT:
                  Um festzustellen welche Prozesse laufen kannst Du unter WIN95/98
                  CreateToolhelp32Snapshot aufrufen. Diese Funktion gibt es erst bei Windows NT 5.0 (bzw. Windows 2000)
                  Für dasselbe Ergebniss musst Du z.Z. unter NT 3 Funktionen mit entsprechendem Code aufrufen.
                  Zurück zur Deiner Frage, Du kannst generell den Kommandostring parsen und brauchst dann keine Unterschiede zwischen NT und WIN32s machen. Aber wenn Du lieber, weil bequemer, argv und argc unter WIN32s nutzen möchtest, dann musst Du eben vorher checken welches Betriebssystem läuft. Da Du aber dieses parsen auf jeden Fall (Deine Software soll ja auf allen Plattformen laufen) vornehmen musst, kannst Du natürlich auf argv und argc verzichten. So ich glaube, ich werde jetzt wohl langsam Konfus und ich will Dich nicht noch mehr verwirren. Wenn Du WIN95 installiert hast, wirst Du ja ziemlich schnell herausfinden, wo der Haken ist. Aber bitte denke daran, dass mich das auch sehr Interssiert und ich Dir über eine Info dankbar bin.

                  Mfg
                  Gerhar

                  Comment


                  • #10
                    Hi Gerhard, das ist genau das, was ich wissen wollte. Jede andere Antwort hätte meine heile Welt total durcheinandergebracht. Natürlich Denke ich an Dich, wenn ich so weit bin. Gruß, Günthe
                    Günther

                    Comment


                    • #11
                      Wie heißt es so schön - Never change a running system !? - Ich kann jetzt ein Lied davon singen. Um mein Programm unter WIN95 zu testen, mußte ich meinen NT-Rechner plattmachen. Ziel war eine Parallelinstallation von WIN95 mit FAT 16 und NT4 mit NTFS, was mir letztendlich auch gelungen ist.

                      Da ich bisher nur SCSI Platten und SCSI CD-ROM hatte, und das WIN95 Setup mein CD-ROM nicht erkannt hatte, bin ich gestern spontan und kurz vor Ladenschluß zum Händler gegangen und hab mir ein IDE CD-ROM und eine IDE Festplatte mit 15 Gigabyte gekauft. Nun kann ich aber nur auf 8 Gigabyte zugreifen. Ich hab ein ASUS P2L97-S Rev. 1.06 Dezember 97, das Award-Bios meldet V4.51PG (c)1984-1995.... Vermutlich brauche ich ein BIOS-Update ? Die Frage, die mich bewegt: Muß die gesamte Festplatte danach neu partitioniert und formatiert werden, oder kann alles so bleiben ? Ich hab irgendwie keine Lust, jetzt sämtliche Programme zu installieren und in ein paar Tagen gehts wieder von vorne los ! Wenn mir jemand kurzfristig die Antwort geben kann, wäre ich sehr dankbar.

                      Mein Programm unter Windows 95 ? Kein Problem ! Der einzige Fehler, den ich gemacht hatte: Ich hatte bei der Ressourcendatei noch \bc4\include statt \bc5\include angegeben. Auch original die Dateien, die mein Kollege am Mittwoch getestet hatte, funktionieren einwandfrei. Was mein Kollege falsch gemacht haben könnte, kann ich aber nicht mehr nachvollziehen: an diesem Wochenende werden alle WIN95 Rechner in der Firma auf NT umgestellt.

                      Gruß: Günthe
                      Günther

                      Comment


                      • #12
                        Hi, meine Frage im zweiten Absatz hätte ich mir sparen können. Ich hätte mal den Festplattenmanager starten sollen, nachdem ich Servicepack 4 installiert hatte. ;-) Günthe
                        Günther

                        Comment


                        • #13
                          Guten Morgen Günther,

                          da kann man ja nur sagen "Ende Gut alles Gut" oder wieder um eine Erfahrung (und eine Festplatte) reicher .....
                          Na ja Du kennst sicherlich auch genug Sprüche. Es freut mich für Dich, dass Du den Fehler gefunden hast und zeigt, dass man manchmal den Wald vor lauter Bäume nicht sieht.
                          Na ja, mir hat trotzdem der Dialog mit Dir viel Spass gemacht und ich bin sicher, dass wir uns hier im Forum noch öfter treffen werden.

                          Mfg
                          Gerhar

                          Comment


                          • #14
                            Zu früh gefreut. Oder: Satz mit X - War wohl nix.

                            Hab mein Programm zwar getestet, ob es unter WIN95 läuft, aber nicht, ob es dort auch drucken kann. Aber da wir in der Firma doch noch nicht auf NT umgestellt hatten - (Ob der Admin Ärger kriegt ?) - bleibt uns oder mir die Blamage vor den Kunden erspart. Die Escape-Zeile liefert einen Wert kleiner oder gleich 0 zurück, das darf nicht sein:

                            char *s="RajaWin drucken..";
                            int l=lstrlen(s);
                            int e=Escape(pd.hDC,STARTDOC,l,s,NULL);

                            In der API-Hilfe finde ich keinen Hinweis darauf, daß es unter WIN95 nicht funktionieren soll. Mit der Funktion

                            StartDoc(pd.hDC, lpdi);

                            wird ein gültiger Wert zurückgegeben, wobei ich die Werte aus einem BC Demoprogramm übernommen habe:

                            DOCINFO di;
                            #ifndef WIN16
                            ZeroMemory(&di, sizeof(DOCINFO));
                            #else
                            memset(&di, 0, sizeof(DOCINFO));
                            #endif
                            di.cbSize = sizeof(DOCINFO);
                            di.lpszDocName = "PrntFile text";
                            di.lpszOutput = NULL;

                            Die Hilfedatei sagt unter DOCINFO:

                            typedef struct { // di
                            int cbSize;
                            LPCTSTR lpszDocName;
                            LPCTSTR lpszOutput;

                            LPCTSTR lpszDatatype; // Windows 95 only; ignored on Windows NT

                            DWORD fwType; // Windows 95 only; ignored on Windows NT

                            } DOCINFO;


                            lpszDatatype

                            Windows 95: Points to a null-terminated string that specifies the type of data used to record the print job.
                            Windows NT: This member is ignored.

                            fwType

                            Windows 95: Specifies additional information about the print job. Can be zero or DI_APPBANDING if the application will use banding. For optimal performance during printing, banding applications should specify DI_APPBANDING.
                            Windows NT: This member is ignored.

                            Wie ist das jetzt zu verstehen ? Wie muß ich lpszDatatype und fwType initialisieren ? Am Ende des Druckjobs habe ich noch:

                            // Escape(pd.hDC,NEWFRAME,NULL,NULL,NULL);

                            //Escape(pd.hDC,ENDDOC,NULL,NULL,NULL);

                            EndDoc(pd.hDC);

                            Der Ausdruck funktioniert jedoch nicht. Liegt es nur an der Initialisierung der beiden Werte, oder wo gbt es beim Ausdruck einer Zeichnung mit Texten sonst noch Probleme ?

                            Danke - Günthe
                            Günther

                            Comment


                            • #15
                              Jetzt klappts endlich. Was noch fehlte, waren die Zeilen StartPage(pd.hDC); und EndPage(pd.hDC)
                              Günther

                              Comment

                              Working...
                              X