Die Funktion GetEnv() kommt in VFP schon lange zum Einsatz. Sie stellt nicht nur die zur Verfügung stehenden Variablen des BS dar, sondern zeigt gleichzeitig als Tooltip den aktuellen Inhalt dieser Variablen an. Benötigen wir nun bspw. eine Liste der auf unserem Rechner freigegebenen Verzeichnisse, dann ist dies über eine Kombination von GetEnv() und ANetResources() möglich.
ANETRESOURCES(myResources,[\\] + GETENV([COMPUTERNAME]),1)
DISPLAY MEMORY LIKE myResources
Oben stehender Code liefert ein 1-Dimensionales Array mit dem Namen 'myResources' in dem sämtliche Netzwerkfreigaben des eigenen Rechners aufgelistet sind.
Wie erhalte ich nun die aktuell gesetzten Umgebungsvariablen in einer Liste?
In 2002 wurde von Michael Reynolds im fox wiki eine ausgesprochen einfache Lösung gepostet. Wissend, dass in der DOS-Shell über den Befehl SET sämtliche Umgebungsvariablen abrufbar sind:
RUN set > setlist.txt
lnFile = FOPEN('setlist.txt')
DO WHILE !FEOF(lnFile)
lcString = FGETS(lnFile)
lcVar = LEFT(lcString, AT('=', lcString) - 1)
? lcVar + ' = ' + GETENV(lcVar)
ENDDO
FCLOSE(lnFile)
Als Fan der Funktion FileToStr() (Wer diesen Blog verfolgt wird dies sicherlich schon bemerkt haben), habe ich Michael's Code auf diese Funktion umgestellt. Die Routine liefert ein 2-Dimensionales Array das in Spalte 1 den Namen und in Spalte 2 den Wert der Umgebungsvariablen enthält.
RUN set > c:\temp\setlist.txt
LOCAL lcSetList as String, i as Integer
* Einlesen der Ergebnisdatei
lcSetlist = FILETOSTR([c:\temp\setlist.txt])
* Ergebnisdatei loeschen
DELETE FILE ([c:\temp\setlist.txt])
* Abarbeitungsschleife für jede Zeile innerhalb der Ergebnisdatei
FOR i = 1 TO GETWORDCOUNT(lcSetList,CHR(13)+CHR(10))
* Array redimensionieren
DIMENSION laSetArray(i,2) as String
* Variablenname auslesen
laSetArray(i,1) = GETWORDNUM(GETWORDNUM(lcSetList,i,CHR(13)+CHR(10)),1,[=])
* Variablenwert auslesen
laSetArray(i,2) = GETWORDNUM(GETWORDNUM(lcSetList,i,CHR(13)+CHR(10)),2,[=])
ENDFOR
* Schleifenergebnis anzeigen
DISPLAY MEMORY LIKE laSetArray
RELEASE lcSetList, i, laSetArray
Im selben wiki-Beitrag (s.o.) zeigte Ed Rauh ein Codemuster auf Basis von Pointern und API-Aufrufen zur Arbeit mit statischen Blöcken wie sie im Zusammenspiel mit Umgebungsvariablen zum Tragen kommen.
Der API-Aufruf GetEnvironmentStrings() liefert einen vom OS verwalteten Datenblock.
Die VFP-Funktion GetEnv() ruft den Wert einer spezifischen Variablen gezielt ab. Hierfür muss jedoch deren genauer Name bekannt sein. GetEnv() unterstützt zwar Intellisense, je nach Einsatzgebiet steht Intellisense jedoch nicht zur Verfügung.
Der u.a. Code liefert ebenfalls einen 2-Dimensionalen Array der in Spalte 1 den Namen und in Spalte 2 den Wert der Umgebungsvariablen enthält.
DECLARE aEnv[1,2]
? GetAllEnvStrings(@aEnv)
DISPLAY MEMORY LIKE aENV
FUNCTION GetAllEnvStrings
LPARAMETER aEnvArray
DECLARE INTEGER GetEnvironmentStrings IN WIN32API
DECLARE SHORT FreeEnvironmentStrings IN WIN32API INTEGER lpszEnvironmentBlock
DECLARE INTEGER lstrcpyn IN WIN32API AS StrCpyN ;
STRING @ lpDestString, ;
INTEGER lpSource, ;
INTEGER nMaxLength
LOCAL nOffset, nEnvironmentBlock, cEnvString, nNumEntries, cEqualPos
DECLARE aEnvArray(1,2)
nNumEntries = 0
cEnvString = ' '
nOffset = 0
nEnvironmentBlock = GetEnvironmentStrings()
DO WHILE LEN(cEnvString) > 0
cEnvString = REPL(CHR(0), 512)
IF StrCpyN(@cEnvString, nEnvironmentBlock + nOffset, 512) # 0
cEnvString = LEFT(cEnvString, MAX(0,AT(CHR(0),cEnvString) - 1))
nEqualPos = AT('=',cEnvString)
IF nEqualPos > 0
nNumEntries = nNumEntries + 1
DECLARE aEnvArray(nNumEntries,2)
aEnvArray[nNumEntries,1] = LEFT(cEnvString,nEqualPos - 1)
aEnvArray[nNumEntries,2] = SUBST(cEnvString, nEqualPos + 1)
nOffset = nOffset + LEN(cEnvString) + 1
ENDIF
ENDIF
ENDDO
=FreeEnvironmentStrings(nEnvironmentBlock)
Keine Kommentare:
Kommentar veröffentlichen