Seite 1 von 1

OemToChar funzt nicht in einer UserLib

Verfasst: 05.02.2009 23:00
von Josef Sniatecki
Hallo,

melde mich mal wieder mit einem Fehler der bei mir aufgetreten ist.

Folgendes habe ich in einer UserLib verwendet. Zum kompilieren habe ich
TailBite genommen:

Code: Alles auswählen

ProcedureDLL.s OemToChar(String.s)
  Protected Result.s=Space(String)
  
  OemToChar_(@String,@Result)
  ProcedureReturn Result
EndProcedure
Diese Funktion wandelt einen eigegebenen String aus der Konsole in
normale Zeichen um (da die Konsole ein anderes Format unterstützt).

Das Problem ist, dass das einfach nach der erstellung der UserLib
nicht richtig funzen will:

Code: Alles auswählen

OpenConsole()
Debug OemToChar(Input())
Wenn ich "ä" eingebe, dann zeigt er mir was ganz komisches in der Debugger-Anzeige an, was eigentlich nicht sein soll.

Programmiere ich in die UserLib den umgekehrten Befehl "CharToOem",
dann kann ich diesen einwandfrei benutzen. Es funktioniert also
"PrintN(CharToOem("ä"))".



Also meine Frage ist: Wieso funktioniert "OemToChar_" in einer UserLib
nicht richtig? Ist das ein API-Problem? Ein Fehler von mir? Oder ist das
ein Fehler an TailBite?

Danke im Voraus
Gruß Josef

Verfasst: 05.02.2009 23:10
von ts-soft
Könnte ein TailBite problem sein, kann ich aber nicht testen, vielleicht
probierste mal eine neuere Version.

Andere Frage: Warum machste aus einem simplen Einzeiler

Code: Alles auswählen

OemToChar_(@string, @string)
Eine IMHO etwas umständliche Funktion in einer Userlib?

Verfasst: 05.02.2009 23:19
von Josef Sniatecki
ts-soft hat geschrieben:Könnte ein TailBite problem sein, kann ich aber nicht testen, vielleicht
probierste mal eine neuere Version.

Andere Frage: Warum machste aus einem simplen Einzeiler

Code: Alles auswählen

OemToChar_(@string, @string)
Eine IMHO etwas umständliche Funktion in einer Userlib?
achso, stimmt... Schönheitsfehler. Bin der gleichen Meinung, dass es ein
Fehler an TailBite sein könnte. Denn wenn ich die Funktion als Include
nutze oder direkt in den Code einfüge, dann funzt sie.

Mal sehen was die anderen sagen.

Verfasst: 05.02.2009 23:45
von Bisonte
Also nee....

Das von euch keiner drüber gestolpert ist....

Code: Alles auswählen

Protected Result.s=Space(String) 
Das geht doch gar nicht .... bei Space muss doch eine Zahl(die anzahl der Spaces) in den Klammern stehen und kein String.

Verfasst: 06.02.2009 00:04
von ts-soft
Bisonte hat geschrieben:Also nee....

Das von euch keiner drüber gestolpert ist....
Naja, wird ja auch vom Compiler angemeckert :mrgreen:
Nach sowas ... hab ich garnicht ausgeschaut :lol:

Verfasst: 06.02.2009 00:10
von Kiffi
Bisonte hat geschrieben:Das von euch keiner drüber gestolpert ist....
Josef Sniatecki hat geschrieben:Denn wenn ich die Funktion als Include
nutze oder direkt in den Code einfüge, dann funzt sie.
soviel dazu :-)

Grüße ... Kiffi

Verfasst: 06.02.2009 13:51
von Josef Sniatecki
OK. Aber das ist nicht der Grund. War halt nur ein Schreibfehler.

Also, hier nochmal richtig:

Code: Alles auswählen

ProcedureDLL.s OemToChar(String.s)
  OemToChar_(@String,@String)
  ProcedureReturn String
EndProcedure
Und genau so habe ich das jetzt in einer UserLib kompiliert und trotzdem
funzt es einfach nicht. Also die Funktion wird zwar korrekt aufgerufen, jedoch
ist das Ergebnis nicht richtig. So als ob das "OemToChar_" ignoriert werden
würde.

Verfasst: 06.02.2009 14:20
von alter Mann
Aus der PB-Hilfe:

Hinweise zur Rückgabe von Strings aus DLL's:

Bei der Rückgabe von Strings aus einer DLL-Funktion muß der String als Global deklariert sein.
Beispiel:

Global ReturnString$

ProcedureDLL.s MyFunction(var.s)
ReturnString$ = var + " test"
ProcedureReturn ReturnString$
EndProcedure

Ohne die Deklaration als Global ist der String nur Lokal in der ProcedureDLL verfügbar und kann somit nicht außerhalb verwendet werden.

Bei der Verwendung von CallFunction() (oder einer ihrer verwandten CallXXX-Funktionen) auf eine DLL-Funktion wird bei der Rückgabe eines Strings immer ein Zeiger auf diesen zurückgegeben, welcher mit PeekS() ausgelesen werden muss.
Beispiel:

String.s = PeekS(CallFunction(0,"FunctionName",Parameter1,Parameter2


Vielleicht hängts ja da dran...

Verfasst: 06.02.2009 14:33
von ts-soft

Verfasst: 06.02.2009 14:43
von Josef Sniatecki
Ich kann zwar nicht gut genug Englisch, jedoch konnte ich entnehmen das
da was nicht TailBite stimmt.

@alter mann
Habe das Resultat als global definiert. Trotzdem will es nicht richtig
funzen. So wie ich weiß gilt das auch nur für einen Aufruf durch Call...
und nicht für Prototypen und UserLibs.