私はたくさんのインターフェースとメソッドを備えたCOMサーバーを書いています。また、ほとんどのメソッドには、パラメーターとして、および戻りに使用されるローカルパラメーターとしてBSTRがあります。スニペットは次のようになります
アップデート5:
実際のコード。これは、特定の条件に基づいてデータの束からフェッチし、DBがオブジェクトの配列にデータを入力します。
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;
}
問題はメモリ解放の部分にあります。コードはどのWinXPマシンでも非常に正常に機能しますが、WIN2K8 R2およびWIN7になると、コードがクラッシュし、:: SysFreeString()が原因として示されます。MSDNはソリューションに十分ではありません。
誰かが正しい解決策を見つけるのを手伝ってもらえますか?
よろしくお願いします:)
アップデート1:
生のBSTRの代わりに提案に従ってCComBSTRを使用してみましたが、直接CStringを使用して初期化され、SysFreeString()が除外されました。しかし、私の問題のために、スコープから外れると、システムはSysFreeString()を呼び出し、これが再びクラッシュを引き起こします:(
更新2: SysAllocString()を使用して割り当てようとした同じCComBSTRで、問題は同じままです:(
更新3: 私はすべてのオプションにうんざりしていて、安心して質問だけを念頭に置いています
SysAllocString()/ string.AllocSysString()を使用して割り当てられたSysFreeString()を介してBSTRを解放する必要がありますか?
更新4: クラッシュに関する情報を提供できませんでした。COMサーバーをデバッグしようとすると、次のようなエラーでクラッシュしました
「ヒープの破損の可能性」
。ここから私を助けてください..:(