Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 241188 (2624)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Profan TIP ab Version 7.0: Stringsrückgabe aus DLLs ohne Be
MRK-Soft
| Datum:23.04.02 17:44 (mrk@mrk-soft.de) |
Hi, Beim Experementieren mit Profan und DLL´s ist mir etwas sehr praktisches Aufgefallen, allerdings NUR ab Profan Version 7.0 Wenn eine DLL Funktion als Rückgabewert ein String liefert, so ist ja allerseits bekannt, dort eine Bereichsvariable anzugeben. so z.b: Dim bereich,40 TestFunktion(bereich#) print String$(bereich#,0) Dispose Bereich# Aber es geht auch anders: Ohne Bereiche !!! Der Rückgabewert wird direkt in ein Profan String geschrieben !!! b$ = space$(40) TestFunktion(addr(b$)) print b$ oder so: b$ = MkStr$(chr$(0),40) TestFunktion(addr(b$)) print b$ Das ganze Funktioniert sogar recht Schnell, werden hier doch Befehle wie DIM und Dispose nicht benötigt, das Programm wird dadurch sogar noch etwas schneller. Zu beachten ist eigentlich NUR, das der String vorher auf die länge gebracht werden MUSS, wie Zeichen erwartet werden. Also Quasi ein unechtes Dim auf String. Dim b#,30 entspricht also: b$ = space$(30) oder: b$ = MkStr$(chr$(0),40) Ersters füllt den String mit Leerzeichen, zweiteres mit dem Wert NULL. Und zu guter letzt noch ein kleiner Code:
    'Api, um die Systemzeit auszulesen
    def GetSystemTime(1) !"kernel32","GetSystemTime"

    'Funktion word, allerdings aus einem String
    def sWord(2) add(mul(ord(mid$(@$(1),add(2,@%(2)),1)),256),ord(mid$(@$(1),add(1,@%(2)),1)))

    'die Traditionlle Methode
    declare b#
    dim b#,16
    GetSystemTime(b#)
    print word(b#,0)  'auf Posiotion NULL steht das Aktuelle Jahr, als Word
    dispose b#

    'es geht aber auch anders, OHNE Beeichsvariablen
    declare b$
    b$ = MkStr$(chr$(0),16)
    GetSystemTime(addr(b$))
    print sWord(b$,0)  'auf Position NULL steht das Aktuelle Jahr, als Word

    waitkey
MRK http://www.mrk-soft.de
Jürgen K.
| Datum:23.04.02 19:04 |
Hallo - das ist doch nichts Neues - das ging schon mit Version 6.0 ... Gruß Jürgen def GetSystemTime(1) !"kernel32","GetSystemTime" declare b$,b& b$ = space$(16) b& = addr(b$) GetSystemTime(b&) print Word(b&,0) waitinput
MRK-Soft
| Datum:23.04.02 19:21 (mrk@mrk-soft.de) |
Stimmt, ab Version 6.0 funktioniert ADDR als Adresszeiger. Nur benutzt hat es bisher so keiner. ausserdem ist der Code ja nur ein Beispiel, mir viel kein anderer passender ein, als API Funktion. Auf jedenfall ist das ein riesen Vorteil, den so füllt die DLL (oder API Funktion) den String mit Werten, und Profan kann dann ganz bequem als String direkt drauf zugreifen und verarbeiten. Das ganze hat sogar noch den Nebeneffekt, das ein vergessendes DISPOSE hier keine Auswirkungen auf dem Speicher hat, der durch DIM resaviert wurde. Der String ist halt Dynamisch im Programmcode.
Sven Schmidts
| Datum: 23.04.02 20:48 (schmidts@flat2serv.de) |
Natürlich funktioniert das, wieso auch nicht? Mit Addr übergibst Du einen Zeiger auf das erste Zeichen des Strings, also Variable[0]. Da Du die Adresse übergibst, kann die DLL direkt ab dieser Position (Zeiger auf das erste [0] Zeichen) in den Speicher schreiben. Da der Speicher verändert wird, wirkt sich das natürlich auf den Inhalt der Profan² Variable aus. Das die Variable gross genug sein muss liegt daran, dass ein fremder Prozess nur den bestehenden Speicher ändern, diesen aber nicht in der Größe verändern kann. Mit Bereichen musst Du nur arbeiten, weil der Zeiger auf [0] bis dahin unbekannt war, was sich aber dank Addr erledigt hat. Mfg. Sven Schmidts

| Zurück zur Übersicht