Hi, Currently regedit is not defined "UNICODE". The point are "max_val_name_len", "valName", "valNameLen". Not max_val_size, valSize. RegQueryInfoKey set the "max_val_name_len" to the size of the longest value name, in characters. This value is not required byte size. N character string: ==> w/ UNICODE, N WHAR string. ==> w/o UNICODE, N ~ 2N unsigned char string. Please, test the CJK locale. and See the "IDS_NEWKEY, IDS_NEWVALUE" in Ja.rc or Ko.rc . If we create the registry "value name" in the empty registry key, we can't see any newly created reg value name. Thanks. Detlef Riekenberg wrote:
On Mi, 2007-04-04 at 10:36 +0900, Byeong-Sik Jeon wrote:
+ /* convert from WCHAR size to maximum required TCHAR size */ + max_val_name_len *= sizeof(WCHAR) / sizeof(TCHAR); + valName = HeapAlloc(GetProcessHeap(), 0, max_val_name_len * sizeof(TCHAR)); valBuf = HeapAlloc(GetProcessHeap(), 0, max_val_size); if (RegQueryValueEx(hKey, NULL, NULL, &valType, valBuf, &valSize) == ERROR_FILE_NOT_FOUND) {
This looks wrong to me: TCHAR is WCHAR, when compiled with UNICODE, otherwise TCHAR is CHAR The code does already handle the different character-size in HeapAlloc for varName.
When the app must handle the case, that sizeof(string) can be > "strlen(string) + sizeof(0)", then we should convert the app to use UNICODE everywhere.
For the last quoted line, valSize is not initialized! (RegQueryInfoKey wrote the result to max_val_size)
Just checked Coverity: not detected