[2/2] oleacc: implemented GetRoleText[A/W] with tests
Nikolay Sivov
bunglehead at gmail.com
Sun Oct 5 01:35:52 CDT 2008
Dmitry Timoshkov wrote:
> "Nikolay Sivov" <bunglehead at gmail.com> wrote:
>
>> +UINT WINAPI GetRoleTextA(DWORD role, LPSTR lpRole, UINT rolemax)
>> +{
>> + UINT length;
>> + WCHAR *roletextW;
>> + CHAR *roletextA;
>> +
>> + TRACE("%u %p %u\n", role, lpRole, rolemax);
>> +
>> + length = GetRoleTextW(role, NULL, 0);
>> + if(length == 0)
>> + return 0;
>> +
>> + roletextW = HeapAlloc(GetProcessHeap(), 0, (length +
>> 1)*sizeof(WCHAR));
>> + if(!roletextW)
>> + return 0;
>> +
>> + GetRoleTextW(role, roletextW, length + 1);
>> +
>> + length = WideCharToMultiByte( CP_ACP, 0, roletextW, -1, NULL, 0,
>> NULL, NULL );
>> +
>> + if(!lpRole){
>> + HeapFree(GetProcessHeap(), 0, roletextW);
>> + return length - 1;
>> + }
>> +
>> + roletextA = HeapAlloc(GetProcessHeap(), 0, length);
>> + WideCharToMultiByte( CP_ACP, 0, roletextW, -1, roletextA,
>> length, NULL, NULL );
>> +
>> + if(rolemax < length)
>> + length = rolemax;
>> +
>> + memcpy(lpRole, roletextA, length);
>> + lpRole[length-1] = '\0';
>> +
>> + HeapFree(GetProcessHeap(), 0, roletextA);
>> + HeapFree(GetProcessHeap(), 0, roletextW);
>> +
>> + return length - 1;
>> +}
>
> Why do you need to allocate an intermediate roletextA?
>
WideCharToMultiByte requires to have a sufficient buffer. I think it's
the easiest way to allocate necessary buffer instead of using local
buffer of some hardcoded length. What do you think?
More information about the wine-devel
mailing list