[RESEND] regedit: Convert from WCHAR size to maximum required TCHAR size.

Bill Medland billmedland at shaw.ca
Wed Apr 4 18:04:03 CDT 2007


On Thu, 2007-05-04 at 06:17 +0900, Byeong-Sik Jeon wrote:
> Bill Medland wrote:
> > On Thu, 2007-05-04 at 02:18 +0900, Byeong-Sik Jeon wrote:
> > > 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. 
> > > 
> > 
> > but the call to HeapAlloc multiplies by sizeof TCHAR already.
> > 
> > > 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));
> > 
> > See!
> > 
> Without UNICODE, sizeof(TCHAR) == 1. This is no effect. CJK multibyte
> character is 2 byte size. 
> 
Yes, but you are getting confused by the term 'character'.  It is being
used in two different senses.  You are using the wrong method to solve
the problem.  You are fixing it where it is not broken; it is (probably)
broken somewhere else.

AFAIK The value returned by RegQueryInfoKey is (supposed to be) the
number of TCHARS required to hold the name.  MSDN means TCHARS when it
says 'character' for this function.  It does not matter that it actually
requires two (char) TCHARS to hold a (language) character.  After all in
UTF-8 it could require even more than two.

> example:
> string "새 값 #1" has 6 characters. It is  max_val_name_len.
> w/  UNICODE, this string is 6 * sizeof(WCHAR) bytes.
> w/o UNICODE, this string is 8 bytes.
>              8 == space(1) * 2 + #(1) + 1(1) + 새(2) + 값(2)
> 
> Currently regedit compiled without UNICODE.
> RegQueryInfoKey result: max_val_name_len ===> 6;
> max_val_name_len++  ===> 7
> max_val_name_len * sizeof(TCHAR) ==> 7 * 1
> This is bad result. we need 9 or more.

So what you have to investigate is why RegQueryInfoKey is returning a
number that is too small.  It should return the number of TCHARS, not
the number of language characters (I believe)

> 
> I'm sorry my poor english. but it is true.
> Thanks.
> 
> PS)
> If you can't see non english character, please install font "Arial Unicode".
> 
> 
> 
> 






More information about the wine-devel mailing list