WinApi Aufruf CharToOem bringt programm zu Absturz

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Vi-P
Beiträge: 30
Registriert: 18.01.2013 18:56

WinApi Aufruf CharToOem bringt programm zu Absturz

Beitrag von Vi-P »

Hallo zusammen,

habe mein Problem auf eine überschaubare Menge an Code reduziert:

Code: Alles auswählen

Procedure test ()
  q.s = "test äöüÄÖÜß"
  z.s = " "
  CharToOem_ (q, z)
  Debug q
  Debug z
EndProcedure

test ()
Dieses Programm kann ich mit PB 4.61 unter XP in der IDE beliebig ausführen. Kein Problem. Unter 5.23 LTS und Windows 7 erhalte ich beim Ausführen nicht immer, aber sehr oft einen "invalid memory access" Fehler. Unicode ist in beiden Fällen aus. Ohne die Umlaute passiert anscheinend nichts. Wird das Programm ohne Prozedur geschrieben, also CharToOem_ () im Hauptprogramm, gibt es ebenfalls keine Fehler. Die Debug Befehle wegzulassen, hilft auch nicht.

Kennt jemand den Effekt? Habe ich etwas übersehen oder falsch gemacht? Sollte ich die Autoren damit nerven?

Edit by NicTheQuick: Code-Tags gesetzt
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WinApi Aufruf CharToOem bringt programm zu Absturz

Beitrag von ts-soft »

Der zweite Buffer muß genauso groß sein, wie der erste Buffer, bei ANSI, bei Unicode sogar größer. Du schreibst aber in einen nicht initialsierten Buffer (1 Byte größe).
Dein Code sollte also so aussehen:

Code: Alles auswählen

Procedure test ()
  q.s = "test äöüÄÖÜß"
  Debug q
  CharToOem_ (q, q)
  Debug q
EndProcedure

test()
So geht es natürlich auch:

Code: Alles auswählen

Procedure test ()
  Protected q.s = "test äöüÄÖÜß"
  Protected z.s = Space(12) ; oder "            "
  CharToOem_ (q, z)
  Debug q
  Debug z
EndProcedure

test() 
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Vi-P
Beiträge: 30
Registriert: 18.01.2013 18:56

Re: WinApi Aufruf CharToOem bringt programm zu Absturz

Beitrag von Vi-P »

Herzlichen Dank ts-soft,

ist (eigentlich) logisch, was Du sagst und die ersten Tests waren auch erfolgreich. Da einem in PB im "Normalfall" die ganze lästige Arbeit, die man z.B. in C mit Strings hat, abgenommen wird, kann es (wie hier) leicht passieren, daß man annimmt, daß sich dies bei winapi Aufrufen genauso verhält. Dabei ist das ja was externes, was von PB an den Programmierer nur "as is" weitergereicht wird... :allright:

Sollten die Entwickler das hier lesen: Wäre hilfreich in der Hilfe ein (kurzes) Kapitel Winapi zu finden, wo zum einen verraten wird, wo man die Info´s (verfügbare Funktionen) zur winapi findet und eben solche Dinge.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WinApi Aufruf CharToOem bringt programm zu Absturz

Beitrag von ts-soft »

Zum Testen kannst Du in den CompilerOptionen den Purifier anschalten! Leider funktioniert
der nicht so richtig mit der aktuellen Beta von 5.40, aber unter allen anderen Versionen sollte
der Funktionieren.

Nach dem Testen aber unbedingt wieder ausschalten, der benötigt nämlich ziemlich viel Zeit!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten