Janitorial dlls/advapi32/registry.c W->A cleanup

Tony Lambregts tony_lambregts at telusplanet.net
Thu Mar 6 10:22:29 CST 2003


Tony Lambregts wrote:

> Dmitry Timoshkov wrote:
>
>> "Tony Lambregts" <tony_lambregts at telusplanet.net> wrote:
>>
>>  
>>
>>> -LONG WINAPI RegSaveKeyW( HKEY hkey, LPCWSTR file, 
>>> LPSECURITY_ATTRIBUTES sa )
>>> +LONG WINAPI RegSaveKeyA( HKEY hkey, LPCSTR file, 
>>> LPSECURITY_ATTRIBUTES sa )
>>> {
>>> -    LPSTR fileA = HEAP_strdupWtoA( GetProcessHeap(), 0, file );
>>> -    DWORD ret = RegSaveKeyA( hkey, fileA, sa );
>>> -    if (fileA) HeapFree( GetProcessHeap(), 0, fileA );
>>> +    UNICODE_STRING fileW;
>>> +    LONG ret;
>>> +
>>> +    RtlCreateUnicodeStringFromAsciiz( &fileW, file );
>>> +    ret = RegSaveKeyW( hkey, fileW.Buffer, sa );
>>> +    RtlFreeUnicodeString( &fileW );
>>>     return ret;
>>>   
>>
>>
>> In the vast majority of cases where an API takes file name, ANSI version
>> of the API is supposed to have a limitation of MAX_PATH characters for
>> the name.
>>
>> Thus, there is no need to waste CPU cycles by allocating/deallocating
>> memory, but instead having an automatic buffer on the stack will be
>> quite enough. See files/drive.c,GetCurrentDirectoryA for a sample.
>>
>> All other APIs which get a file name as a parameter should be rewritten
>> that way too. Probably that's the task for yet another janitorial 
>> project...
>>
>> All the said above doesn't mean that your patch can't applied as is,
>> that just means that there is a better way of doing this task.
>>
>>  
>>
> Yeah I actually had it that way at one point due to my familairity 
> with drive.c and well... I ran into some compiler errors (in 
> RegSaveKeyW) that ended up making the problem worse. Perhaps it was 
> something I simple I missed. I can take another look at it if it will 
> save some CPU cycles.

when I change the code to the following
LONG WINAPI RegSaveKeyA( HKEY hkey, LPCSTR file, LPSECURITY_ATTRIBUTES sa )
{
    WCHAR fileW[MAX_PATH];
    LONG  ret, len;
   
    len = WideCharToMultiByte(CP_ACP, 0, fileW, -1, file, 0, NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, fileW, -1, file, len, NULL, NULL);
    ret = RegSaveKeyW( hkey, fileW.Buffer, sa );
    return ret;
}

I get the following warning

warning: passing arg 5 of `WideCharToMultiByte' discards qualifiers from 
pointer target type

WideCharToMultiByte does not like LPCSTR. So what to do?

-- 

Tony Lambregts






More information about the wine-devel mailing list