Brian, On the client side, you need more error checking. You don't check the value of res after some calls. And you don't check to make sure the returned out parameters are valid. Any one of these things can go wrong. And you never know what you'll get back from someone else's code.
Likewise, on the server side, you don't check the input parameters to make sure they're non-null. And you don't check to make sure that the user hasn't requested fewer key bindings than you provide. There is at least one case when you don't initialize a local variable, which you should always do, even when you're passing that variable to a function using it as an out parameter. That allows you to be more confident in correct checking of the return value of the parameter. Also, if I were doing this, I would not free the BSTR's in the Process function. It's easy to lose track of allocating and freeing memory. So, I would have Process take a const wchar_t*, and have the function that requested the actions free each BSTR in turn. That way, you can clearly see where the memory was allocated (in the call to get the actions) and where it is freed. This will give less responsibility to the Process function, and make the memory allocation and deallocation easier for the next person to understand. Thanks, RG _____ From: [email protected] [mailto:[email protected]] On Behalf Of Pete Brunet Sent: Tuesday, February 23, 2010 6:43 PM Cc: [email protected]; IA2 List Subject: Re: [Accessibility-ia2] [Accessibility] Newbie question: help withBSTR arrays Hi Brian, I suspect there are some important readers that don't watch this list. I'm cc'ing it to the IA2 list. -Pete Brian Cragun wrote: Thanks for your interest and patience. The following code seems to be working. It shows a CLIENT fragment that calls for the key bindings and then pulls them off for processing. The SERVER snippet shows how I am building a simple three element BSTR array. Please advise if you see any stupid errors being made. Thanks! Brian CLIENT: res = m_spAccessible2->QueryInterface(IID_IAccessibleAction,(void**)&m_spAccessibl eAction); long nActions = 0L; res = m_spAccessibleAction->nActions(&nActions); if(SUCCEEDED(res)){ BSTR name; BSTR description; for (int iAction=0 ; iAction<nActions; iAction++){ res = m_spAccessibleAction->get_name(iAction, &name); if(SUCCEEDED(res)){ Process(name); // Process the name and free the string } res = m_spAccessibleAction->get_description(iAction, &description); if(SUCCEEDED(res)){ Process(description); // Process the name and free the string } BSTR *aKeyBindings; long aNumMaxBinding = 10; long aNumBindings; res = m_spAccessibleAction->get_keyBinding(iAction, aNumMaxBinding, &aKeyBindings, &aNumBindings); if(SUCCEEDED(res)){ for (int jBind=0; jBind<aNumBindings; jBind++){ Process(aKeyBindings[jBind]); // Process the name and free the string } CoTaskMemFree(aKeyBindings); } } } SERVER: STDMETHODIMP AccServer::get_keyBinding(long aActionIndex, long aNumMaxBinding, BSTR **aKeyBinding, long *aNumBinding) { *aKeyBinding = static_cast<BSTR*>(CoTaskMemAlloc((aNumMaxBinding) * sizeof(BSTR*))); if (!*aKeyBinding) return E_OUTOFMEMORY; *aKeyBinding[0] = ::SysAllocString(OLESTR("0 key binding")); // if (!*(aKeyBinding[0])) return E_OUTOFMEMORY; (*aKeyBinding)[1] = ::SysAllocString(OLESTR("1 key binding")); // if (!*(aKeyBinding[1])) return E_OUTOFMEMORY; (*aKeyBinding)[2] = ::SysAllocString(OLESTR("2 key binding")); // if (!*(aKeyBinding[2])) return E_OUTOFMEMORY; *aNumBinding = 3L; return S_OK; } Brian Cragun IBM AbilityLab Consultant Human Ability & Accessibility Center <http://www.ibm.com/able> www.ibm.com/able & <http://w3.ibm.com/able> w3.ibm.com/able W:(720)-663-2801 H:(507)288-2437 Subscribe to RSS feed and contribute to <http://w3.ibm.com/connections/communities/service/html/communityview?commun ityUuid=136047f0-6cda-4a2a-9a90-2188047a542a> Accessibility News communityon Connections <http://www.facebook.com/IBMAccessibility> IBM Accessibility on Facebook ▼ <http://twitter.com/IBMAccess> IBMAccess on Twitter ▼ <http://www.linkedin.com/e/vgh/2419815/> IBM Accessibility on LinkedIn From: Brian Cragun/Rochester/i...@ibmus To: [email protected] Date: 02/22/2010 01:52 PM Subject: [Accessibility] Newbie question: help with BSTR arrays Sent by: [email protected] _____ I'm struggling to understand how a BSTR array is properly allocated and content is added to it. Also how the BSTRs in the array are retrieved. Does anyone have any simple examples? The information at <http://accessibility.freestandards.org/a11yspecs/ia2/docs/html/_generalinfo .html#_arrayConsideration> http://accessibility.freestandards.org/a11yspecs/ia2/docs/html/_generalinfo. html#_arrayConsideration is useful but not quite enough for me. I assume I need to allocation the memory with CoTaskMemAlloc and release it with CoTaskMemFree. Thanks! - Brian Brian Cragun IBM AbilityLab Consultant Human Ability & Accessibility Center <http://www.ibm.com/able> www.ibm.com/able & <http://w3.ibm.com/able> w3.ibm.com/able W:(720)-663-2801 H:(507)288-2437 _______________________________________________ Accessibility mailing list [email protected] <https://lists.linux-foundation.org/mailman/listinfo/accessibility> https://lists.linux-foundation.org/mailman/listinfo/accessibility _____ _______________________________________________ Accessibility mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/accessibility -- Pete Brunet a11ysoft - Accessibility Architecture and Development (512) 238-6967 (work), (512) 689-4155 (cell) Skype: pete.brunet IM: ptbrunet (AOL, Google), [email protected] (MSN) http://www.a11ysoft.com/about/ Ionosphere: WS4G
_______________________________________________ Accessibility-ia2 mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/accessibility-ia2
