Я пишу COM-сервер, который имеет множество интерфейсов и методов.И большинство методов имеют BSTR как параметры и как локальные параметры, используемые для возврата.Фрагмент выглядит как
Обновление 5:
Реальный код.Он извлекается из набора данных на основе конкретного условия БД для заполнения массива объектов.
STDMETHODIMP CApplication::GetAllAddressByName(BSTR bstrParamName, VARIANT *vAdddresses)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
//check the Database server connection
COleSafeArray saAddress;
HRESULT hr;
// Prepare the SQL Strings dan Query the DB
long lRecCount = table.GetRecordCount();
if (lRecCount > 0)
{
//create one dimension safe array for putting details
saAddress.CreateOneDim(VT_DISPATCH,lRecCount);
IAddress *pIAddress = NULL;
//retrieve details
for(long iRet = table.MoveFirst(),iCount=0; !iRet; iRet = table.MoveNext(),iCount++)
{
CComObject<CAddress> *pAddress;
hr = CComObject<CAddress>::CreateInstance(&pAddress);
if (SUCCEEDED(hr))
{
BSTR bstrStreet = ::SysAllocString(table.m_pRecordData->Street);
pAddress->put_StreetName(bstrStreet);
BSTR bstrCity = ::SysAllocString(table.m_pRecordData->City);
pAddress->put_CityName(bstrCity);
}
hr = pAddress->QueryInterface(IID_IAddress, (void**)&pIAddress);
if(SUCCEEDED(hr))
{
saAddress.PutElement(&iCount,pIAddress);
}
}
*vAdddresses=saAddress.Detach();
}
table.Close();
return S_OK;
}
STDMETHODIMP CAddress::put_CityName(BSTR bstrCityName)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// m_sCityName is of CComBSTR Type
m_sCityName.Empty();//free the old string
m_sCityName = ::SysAllocString(bstrCityName);//create the memory for the new string
return S_OK;
}
Проблема заключается в части освобождения памяти.Код работает очень хорошо на любых машинах с Win XP, но когда дело доходит до WIN2K8 R2 и WIN7, код падает и указывает на виновника :: SysFreeString ().MSDN не подходит для решения.
Может ли кто-нибудь помочь в поиске правильного решения?
Заранее большое спасибо:)
Обновление 1:
Я пытался использовать CComBSTR в соответствии с предложением вместо необработанного BSTR, инициализируется с использованием прямых CString и исключает SysFreeString ().Но из-за моей проблемы при выходе из области видимости система вызывает SysFreeString (), что снова вызывает сбой: (* 1020 *
Обновление 2: С тем же CComBSTR, который я пытался выделить с помощьюSysAllocString (), проблема остается той же: (
Обновление 3: Я устал от всех вариантов, и в мире я имею в виду только вопрос
Нужно ли освобождать BSTR через SysFreeString (), который был выделен с помощью SysAllocString () / string.AllocSysString ()?
Обновление 4: Я пропустил, чтобы предоставить информациюо сбое. Когда я попытался отладить сбой COM-сервера с ошибкой, говорящей
«Возможное повреждение кучи»
. Пожалуйста, помогите мне отсюда ..:(