DIM DYNAMIC a$[0][0] IniReadSection(a,"Test.ini", "TEST") IF a[0][0] <> "" THEN DIM nUbound nUbound = VAL(a[0][0]) FOR INTEGER iCC = 1 TO nUbound Print "Key_" & STR$(iCC) & ": " & a[iCC][0] & CRLF$ & _ "Val_" & STR$(iCC) & ": " & a[iCC][1] NEXT iCC ELSE PRINT "Error" ENDIF pause FUNCTION IniReadSection(aIniSec AS STRARRAY PTR, sInFileName$, sSection$) 'Get the fullpathname (ini functions need a full path) LOCAL sFileName AS STRING LOCAL sFilePart AS CHAR PTR GetFullPathName(sInFileName, MAX_PATH, sFileName, &sFilePart) 'Just in case someone is using a dinosaur OS, invoke 32kb limit if needed LOCAL iRes AS INTEGER LOCAL iBuff AS INTEGER iBuff = 32767 IF OSVERSION > 3 THEN iBuff = LOF(sFileName$) + 1 LOCAL DYNAMIC szBuffer[iBuff] AS CHAR iRes = GetPrivateProfileSection(sSection, szBuffer, iBuff, sFileName) LOCAL DYNAMIC pIniKey[(iRes)] AS CHAR LOCAL DYNAMIC pIniVal[(iRes)] AS CHAR REDIM aIniSec$[(iRes) + 1][2] 'LOCAL DYNAMIC aIniSec$[(iRes)][2]'Would really like a ByRef Array here!!! LOCAL n,keycount,valcount,iIniAdd keycount = 0 : n = -1 : valcount = 0 : iIniAdd = 0 LOCAL nPadKey, nPadVal, iCC nPadKey = 0 : nPadVal = 0 : iCC = 0 IF iRes = 0 THEN REDIM aIniSec$[0][0] FUNCTION = 0 ELSE WHILE (++n <= iRes)'KEY IF szBuffer[n] = 0 THEN 'There's got to be a smarter way than this to clear values and reset FOR INTEGER iCC = 0 TO nPadKey szBuffer[n-iCC] = 0 pIniKey[iCC] = 0 pIniVal[iCC] = 0 NEXT n -= nPadKey nPadKey = 0 nPadVal = 0 ELSEIF szBuffer[n] = 61 THEN szBuffer[n] = 0 iIniAdd++ aIniSec$[iIniAdd][0] = pIniKey$ nPadKey = 0 WHILE (++n <= iRes)'VALUE IF szBuffer[n] = 0 THEN EXIT WHILE pIniVal[nPadVal] = szBuffer[n] nPadVal++ WEND nPadVal = 0 szBuffer[n] = 0 aIniSec$[iIniAdd][1] = pIniVal$ ELSE pIniKey[nPadKey] = szBuffer[n] nPadKey++ ENDIF WEND ENDIF aIniSec$[0][0] = TRIM$(STR$(iIniAdd)) 'How many elements in 1st dimension since no real UBound aIniSec$[0][1] = "1" 'How many elements in 2nd dimension since no real UBound REDIM PRESERVE aIniSec$[iIniAdd+1][2] FUNCTION = 1 END FUNCTION