UWSC ReadIni 2047の壁

追記 20120605

uwsc4.8にて、修正されたため本記事はもはやゴミです(^^;;;




UWSCのReadIniには、2047文字の壁がある模様。
公式掲示板にて、書けるけど読めない、という記述を見た。
ので、回避策を考えてみた。




けど、結局のところ、Win32APIの32KBの壁が越えられません。
(WritePrivateProfileStringでは64KBでもかけるのに)
ということで、どれほどの意味があるかは不明、、、。


ini.uws

OPTION EXPLICIT

IFB GET_UWSC_NAME = "ini.uws" THEN
	Const SEC = "試験"
	Dim i = 1024, strdata = FORMAT("*", i)
	While i <= 4096
		DeleteIni(SEC, i)
		WriteIni(SEC, i, strdata)
		Print "ReadIni  " + i + " = " + Length(ReadIni(SEC, i))
		Print "Ini.Read " + i + " = " + Length(Ini.Read(SEC, i))
		i = i * 2
		strdata = strdata + strdata
	Wend
ENDIF


MODULE Ini
	DEF_DLL GetPrivateProfileStringA(string, string, string, var string, dword, string): dword: kernel32
	DIM _defIniPath
	CONST _defBufSize = 1024

	PROCEDURE Ini
		_defIniPath = ".\" + COPY(GET_UWSC_NAME, 1, LENGTH(GET_UWSC_NAME) - 3) + "ini"
	FEND

	FUNCTION Read(sec, key, path="")
		IF LENGTH(path) = 0 THEN path = _defIniPath
		DIM size = _defBufSize, buf = FORMAT(CHRB(0), size), ret = -1
		WHILE ret = -1
			ret = GetPrivateProfileStringA(sec, key, "", buf, size, path)
			IFB ret >= size - 2 THEN
				size = size * 2
				buf = FORMAT(CHRB(0), size)
				ret = -1
			ENDIF
		WEND
		RESULT = TRIM(buf)
	FEND

	PROCEDURE Write(sec, key, val, path="")
		WriteIni(sec, key, val, path)
	FEND

	PROCEDURE Delete(sec, key, path="")
		DeleteIni(sec, key, path)
	FEND

ENDMODULE


なんとなく、GetPrivateProfileStringはAを使ってみた。


しかし、32KBの壁に関する記載は、ないんだけど、、、。
もっとも、GetPrivateProfileStringは互換性のために残してあるだけなので、知らん、とかマイクロソフトに言われそうな気がする、、、。