Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 241188 (2624)
  Suchen
 Zurück zur Übersicht
 AutorThema: Profan TIP ab Version 7.0: Stringsrückgabe aus DLLs ohne Be
MRK-Soft
Datum:23.04.02 17:44 Antwortenals Email verschicken (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 Antwortenals Email verschicken  


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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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