Re: How do I add CB_SETITEMDATA to a comboBox with wstring as LPAR
I'm looping through a search on Active Directory. I want to store the "cn"
field retried to comboBox as selectable listitems. I then in the code I
listed, need to store the matching "distinguishedName" field for each
coorsponding "cn"(CommonName" fiedl. I need to keep all these in combox in
my dialog page until the end of my code, and delete the "distinguishedName"
that I stored in comboBox as SetItemData in my desctor code. Do you think
this will work? I men, the new wstring that I declare evey time in the loop,
would it keep unitl then and not create a memory problem? Thank you.
hResult = padsSearchContainer->ExecuteSearch((LPWSTR)(wsFilter.c_str()),
rgpszAttributeList,
ARRAYSIZE( rgpszAttributeList ),
&hSearch);
if ( SUCCEEDED(hResult) )
{
//Call IDirectorySearch::GetNextRow() to retrieve the next row of data.
hResult = padsSearchContainer->GetFirstRow(hSearch);
if (SUCCEEDED(hResult))
{
// Loop through each row returned
while (hResult != S_ADS_NOMORE_ROWS)
{
// Get and add the first attribute (common name)
// Variables for column name
ADS_SEARCH_COLUMN colSearchColumn;
//First get the cn of groups then append it to the combobox
hResult = padsSearchContainer->GetColumn(hSearch, rgpszAttributeList[0],
&colSearchColumn);
if (SUCCEEDED(hResult))
{
// Add the context cn attribute
_ASSERT( CB_ERR != SendDlgItemMessage(hwndDlg, IDC_PrimaryGroup,
CB_INSERTSTRING, index,
(LPARAM)((colSearchColumn.pADsValues->CaseIgnoreString))));
padsSearchContainer->FreeColumn( &colSearchColumn );
}//end if
//2nd, get the distinguishedName of the group and store it in vector
ADS_SEARCH_COLUMN colSearchColumnDN;
//First get the cn of groups then append it to the combobox
hResult = padsSearchContainer->GetColumn(hSearch, rgpszAttributeList[1],
&colSearchColumnDN);
if (SUCCEEDED(hResult))
{
// Add the context cn attribute
//std::wstring wsGroup = new wstring;
//wsGroup = (colSearchColumnDN.pADsValues->CaseIgnoreString);
PWSTR group = new
wchar_t[wcslen((colSearchColumnDN.pADsValues->CaseIgnoreString))];
SendMessage(hwndPrimGroup,CB_SETITEMDATA, index, (LPARAM)group);
//primaryGroups.push_back(wsGroup);
padsSearchContainer->FreeColumn( &colSearchColumnDN );
}//end if
//Get the next row
hResult = padsSearchContainer->GetNextRow(hSearch);
index++;
}//end while there are more context to list
}//end if (SUCCEEDED(hResult)) in getting first row
padsSearchContainer->CloseSearchHandle(hSearch);
}// end if hResult = padsSearchContainer->ExecuteSearch()
--
Thanks.
"Frank Hickman [MVP]" wrote:
"Pucca" <Pucca@discussions.microsoft.com> wrote in message
news:03E5717B-E653-439F-90B7-352514AEDEBE@microsoft.com...
Also, is it correct and OK to put the declaration of the wstring in side
of
this loop? Currently, with this code I'm getting the following error
message
from the compiler.
Error 1 error C2440: 'initializing' : cannot convert from
'std::wstring *' to 'std::basic_string<_Elem,_Traits,_Ax>'
c:\Projects\UnityExtProperty\CUserPage.Cpp 884
//while (loop condition is true)
// Add the context cn attribute
std::wstring wsGroup = new wstring;
wsGroup =
(colSearchColumnDN.pADsValues->CaseIgnoreString);
SendMessage(hwndPrimGroup,CB_SETITEMDATA,
index, (LPARAM)T2CW(wsGroup.c_str()));
primaryGroups.push_back(wsGroup);
padsSearchContainer->FreeColumn(
&colSearchColumnDN );
//end while loop
--
Thanks.
Not exactly sure what your trying to do here, set the item data value or set
the text for the item but if it is in fact the item data value, try changing
your SendMessage to
SendMessage(hwndPrimGroup,CB_SETITEMDATA, index, (LPARAM)&wsGroup);
What your currently trying to do is assign a character pointer to a combobox
data item and loosing the wstring object on the next call. This will result
in memory leaks since the character pointer returned by c_str is not the
actual wstring object.
--
============
Frank Hickman
Microsoft MVP
NobleSoft, Inc.
============
Replace the _nosp@m_ with @ to reply.