SYMPTOMS
When you use XlCoerce in a dynamic-link library (DLL) that is loaded by
Microsoft Excel 97, the following error message appears
Unhandled exception in excel.exe (MSO97.DLL): 0xc0000005: Access
Violation
and Microsoft Excel stops responding.
RESOLUTION
To correct this problem, install Microsoft Excel 97 Service Release 1 (SR-
1).
To temporarily work around this problem, use one of the following methods.
Method 1
If XLOPER does not reference any cells that contain text, use the
following function to determine whether to use XlCoerce:
/*********
* RangeContainsText
*
* Purpose: Determine if a XLOPER reference points to a range that
* contains any cells containing text. Microsoft Excel 97
* stops responding if XlCoerce is used to convert a
* reference to a string.
*
* Parameter:
* pxRange[in] Range to check.
*
* Return: TRUE - Range contains text, or Excel4 call fails.
* FALSE - Range does not contain text and it is safe to
* use XlCoerce on the reference as a workaround
* to the problem.
*
*******************************************************************/
BOOL RangeContainsText(LPXLOPER pxRange)
{
DWORD dwRet = 0;
XLOPER xIsText;
BOOL bRet = TRUE; // Value returned if Excel4 Fails
// Check determine whether you are working with a range
if( !((xltypeSRef | xltypeRef) & (pxRange->xltype)))
return bRet;
dwRet = Excel4(xlfIstext,&xIsText,1,pxRange);
if( xlretSuccess == dwRet && xltypeErr != xIsText.xltype)
{
XLOPER xRet;
dwRet = Excel4(xlfOr,&xRet,1,&xIsText);
if( xlretSuccess == dwRet && xltypeBool == xRet.xltype)
bRet = xRet.val.bool;
}
Excel4(xlFree,0,1,&xIsText);
return bRet;
}
Method 2
Instead of using the R data type to pass a range or a cell that may contain
text, use the OPER data type (P). This data type does not support
references, but it does support arrays, numbers, Boolean values, and
errors. For more information about the Register function, see the
Microsoft
Excel Software Development Kit (SDK).
Method 3
When the cells contain text, use Automation to get the values from the
cells. You can use the information in a reference XLOPER to build a Range
object that you can pass to Microsoft Excel through Automation. When you do
this, values in cells are returned to the DLL as a SAFEARRAY, which you can
use to build an XLOPER array of values.
The 32-bit Generic Framework example for Microsoft Excel in the Microsoft
Download Center implements this method. The method is integrated in the
Microsoft Excel SDK framework; therefore, it's not necessary to change any
code that uses the Excel() wrapper.
For additional information, please see the following article in the
Microsoft Knowledge Base:
152152
SAMPLE: FRMWRK32.EXE: Updated Generic.xll Template for Excel
To integrate the framework into another project, use the following steps:
- Add xlAuto.cpp, xlCoerce.cpp and Framewrk.c to the existing project and
place framewrk.h and xlcoerce.h in the directory for the project.
- Call InitFramework() from the xlAutoOpen.
- Call QuitFramework() from the xlAutoClose.
- Add "CheckInstance" to the exports section of the DEF file for the
project.