Vorsicht bei SalStrLop (in TD3.1)

Wenn SalStrLop auf eine leere Zeichenfolge (sString) angewendet wird, können seltsame Dinge geschehen. Grund dafür ist, dass Gupta die interne Pufferlänge auf null setzt. Wenn diese Zeichenfolge mit einer anderen Zeichenfolge (sString2) verkettet wird, wird deren Puffer jedes Mal um eins vermindert. Wenn eine solche Zeichenfolge an eine externe DllFunktion übergeben wird, treten Abstürze auf, weil beim Kopieren des Strings nur nBufferLen Zeichen kopiert werden. In der Regel fehlt die terminierende Null. Den Rest könnt ihr euch denken.
Hier ist Code, der das Problem veranschaulicht:
Set sTest = ''
Set sTest2 = 'A'
Set nBuffer = SalStrGetBufferLength( sTest ) ! nBuffer is 1 - just the trailing zero
Set nBuffer = SalStrGetBufferLength( sTest2 ) ! nBuffer is 2 - 'A' and trailing zero
Call SalStrLop( sTest )
Set nBuffer = SalStrGetBufferLength( sTest ) ! nBuffer is 0!
Set sTest2 = sTest2 || sTest
Set nBuffer = SalStrGetBufferLength( sTest2 ) ! nBuffer is 1!!

Workaround: SalStrLop nur auf nicht leere Strings anwenden. Z.B. mit einer Funktion wie dieser:

!!CB!! 134
Function: StrLopSafe
 Description:
 Returns
  Number:
 Parameters
  Receive String: sIn
 Static Variables
 Local variables
 Actions
  If ( sIn )
   Return SalStrLop( sIn )
  Else
   Return 0

In TD6.3 existiert das Problem übrigens nicht.

Happy coding!

Advertisements

Über thomasuttendorfer
Ich bin Entwicklungsleiter bei der Softwarefirma [ frevel & fey ] in München. Wir entwickeln Business-Software für Verlage und verwenden dafür den Gupta Team-Developer sowie Visual Studio.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: