![]() |
variants and freeing bstr memory (C++)
I am having a problem with Excel 2003 running out of "memory
handles" on my Windows 7 x64 box after creating several hundred excel spreadsheets. I am explicitly releasing all of my Dispatch pointers. Do I need to explicitly release my variants after I store a bstr in them ? For instance, the following code converts a cell range string into a bstr and gets excel to return a Dispatch pointer for putting stuff into that range. VARIANT range; VariantInit ( & range); range.vt = VT_BSTR; _bstr_t address = _bstr_t (cellAddress.c_str ()); range.bstrVal = address; std::string errorMsg = "Select a range in the active spreadsheet, " + cellAddress + " (PutStringInServer)"; OLEMethod (DISPATCH_PROPERTYGET, & result1, pExcelSheet, L"Range", errorMsg, 1, range); if (result1.vt == VT_DISPATCH) { .... So, do I need to release the range variant variable ? Thanks, Lynn |
variants and freeing bstr memory (C++)
On 11/30/2010 2:40 PM, Lynn McGuire wrote:
I am having a problem with Excel 2003 running out of "memory handles" on my Windows 7 x64 box after creating several hundred excel spreadsheets. I am explicitly releasing all of my Dispatch pointers. Do I need to explicitly release my variants after I store a bstr in them ? For instance, the following code converts a cell range string into a bstr and gets excel to return a Dispatch pointer for putting stuff into that range. VARIANT range; VariantInit ( & range); range.vt = VT_BSTR; _bstr_t address = _bstr_t (cellAddress.c_str ()); range.bstrVal = address; std::string errorMsg = "Select a range in the active spreadsheet, " + cellAddress + " (PutStringInServer)"; OLEMethod (DISPATCH_PROPERTYGET, & result1, pExcelSheet, L"Range", errorMsg, 1, range); if (result1.vt == VT_DISPATCH) { ... So, do I need to release the range variant variable ? Thanks, Lynn I've been looking at VariantClear http://msdn.microsoft.com/en-us/library/ms221165.aspx and it appears that VariantClear should always be called for any variant containing a dispatch pointer or a bstr pointer. Lynn |
variants and freeing bstr memory (C++)
On 11/30/2010 5:42 PM, Lynn McGuire wrote:
On 11/30/2010 2:40 PM, Lynn McGuire wrote: I am having a problem with Excel 2003 running out of "memory handles" on my Windows 7 x64 box after creating several hundred excel spreadsheets. I am explicitly releasing all of my Dispatch pointers. Do I need to explicitly release my variants after I store a bstr in them ? For instance, the following code converts a cell range string into a bstr and gets excel to return a Dispatch pointer for putting stuff into that range. VARIANT range; VariantInit ( & range); range.vt = VT_BSTR; _bstr_t address = _bstr_t (cellAddress.c_str ()); range.bstrVal = address; std::string errorMsg = "Select a range in the active spreadsheet, " + cellAddress + " (PutStringInServer)"; OLEMethod (DISPATCH_PROPERTYGET, & result1, pExcelSheet, L"Range", errorMsg, 1, range); if (result1.vt == VT_DISPATCH) { ... So, do I need to release the range variant variable ? Thanks, Lynn I've been looking at VariantClear http://msdn.microsoft.com/en-us/library/ms221165.aspx and it appears that VariantClear should always be called for any variant containing a dispatch pointer or a bstr pointer. OK, I now know that you cannot VariantClear any variant that you have added to a SafeArray using SafeArrayPutElement. I thought that SafeArrayPutElement does a deep copy on the variant containing a BStr being added to SafeArray but I was wrong. That is a sure way to lose your string headed to Excel. Lynn |
All times are GMT +1. The time now is 10:41 PM. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com