Announcement

Collapse
No announcement yet.

OEMToCHAR-Problem

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

  • OEMToCHAR-Problem

    Hallo,

    bei dem folgenden Aufruf erhalte ich eine Zugriffsverletzung in user32.dll. (Delphi6 prof., Windows XP).

    Weiß jemand, warum?
    <pre>
    var s : string;
    begin
    s:= 'FR\SCHL, M]NCHEN';
    OEMtoChar(PChar(s),PChar(s));
    showmessage(s);
    end;
    </pre>

    Danke und Gruß Uli

  • #2
    Die Hilfe sagt es geht nur mit der Ansi Variante inplace. Wahrscheinlich ruft XP standardmaessig die Unicode Variante auf

    Comment


    • #3
      Sorry, ich verstehe nicht, was du meinst.

      Und in der Hilfe kann ich nichts derartiges entdecken.

      Gruß Ul

      Comment


      • #4
        <PRE>
        var
        s: string;
        buf: array [0..8191] of Char;
        begin
        s:= 'FR\SCHL, M]NCHEN';
        OEMtoChar(PChar(s), buf);
        showmessage(buf);
        end;
        </PRE><br&gt

        Comment


        • #5
          Wenn das klappt, dann brauchst du einen zweiten Puffer

          Comment


          • #6
            Hallo Robert,

            danke, so geht's. Aber warum die andere Variante unter WindowsXP nicht geht, habe ich noch nicht gecheckt.

            Gruß Ul

            Comment


            • #7
              Windows "000/XP sind Unicode basierte Betriebssysteme. Die meisten Win32 Funktionen gibt es daher in einer ANSI und einer Unicode Variante.<br>
              OemToChar scheint unter XP die Unicode Variante aufzurufen.<br>
              In der Hilfe steht das nur fuer die ANSI Variante inplace, also im gleichen Puffer aufgerufen werden darf.<br>
              Es kann moeglich sein das sich die Stringlaenge aendert. Ausserdem ist die Zeichenauswertung in Unicode nicht so einfach Zeichen fuer Zeichen

              Comment


              • #8
                Hallo Zusammen,<br>
                <br>
                nur so zur Ergänzung. Die Funktion existiert schon seit NT als Unicode Variante. Ich kenne jetzt zwar D6 nicht, gehe aber mal davon aus, dass bei einem entsprechenden OS automatisch die Unicode Variante der Funktion eingebunden wird.<br>
                @Uli:<br>
                Versuch doch mal, ob es anders läuft, wenn Du statt OEMToChar OEMToCharA als Funktionsnamen angibst. Damit würdest Du dann gezielt die Ansi Version aufrufen. Damit sollte es dann auch funktionieren<br>
                Leider weiss ich nicht, ob Delphi dafür sorge trägt, dass zur Laufzeit die richtige Version aufgerufen wird, wäre aber mal ganz interessant zu erfahren, denn wenn die Unicode Version fest eingebunden wäre hätte das Programm unter 9x möglicher weise Probleme.<br>
                <br>
                Ciao<br>
                Chri

                Comment


                • #9
                  Hallo,,

                  @Robert: vielen Dank. Jetzt ist mir die Sache klar.

                  @Chris: OemToCharA funktioniert bei mir genauso wenig. Das Ganze ist deswegen ärgerlich, weil man nun wieder alle Programme, die diese Funktion verwenden durchforsten und evt. "korrigieren" muss.

                  Der Preis des Fortschritts?

                  Gruß Ul

                  Comment


                  • #10
                    Nachtrag: An Delphi6 liegt's jedenfalls nicht. Unter Delphi5 compiliert tritt mit Windows XP derselbe Fehler auf.

                    Gruß Ul

                    Comment


                    • #11
                      Kann gut sein. Microsoft schreibt immer wieder Funktionen neu, die eigentlich perfekt funktionieren

                      Comment


                      • #12
                        Hier ein Auszug aus einer Newsgroup. Kommentar eines Borland-Mitarbeiters:

                        ...shortfall of these conversion routines is that the size of the string being translated must be below a certain threshold.
                        Otherwise you overwrite unallocated memory...some machines may let this pass, and others (particularly NT) will generate an exception.
                        If the routine uses the Windows functions OemToAnsi or OemToChar, then the destination pointer MUST have allocated enough space for the destination string and you should have a safety check to abort if it does not

                        Deine Variante, Robert, ist demnach die einzig richtige.

                        Gruß Ul

                        Comment

                        Working...
                        X