FIX: ADO Recordset GetString() Function Throws an Access Violation in Oleaut32.dll
<script type="text/javascript">function loadTOCNode(){}</script>Article ID | : | 230276 |
Last Review | : | November 4, 2003 |
Revision | : | 2.0 |
This article was previously published under Q230276
On This Page
SYMPTOMS
<script type="text/javascript">loadTOCNode(1, 'symptoms');</script>
Calling the GetString() function on a _RecordsetPtr object may cause the following error to occur:
Unhandled Exception in <application name> (OLEAUT32.DLL) : 0xC0000005: Access Violation
CAUSE
<script type="text/javascript">loadTOCNode(1, 'cause');</script>
The #import-generated wrapper function GetString() passes an uninitialized BSTR pointer to the ADO raw_GetString() function as an out parameter. The raw_GetString() function incorrectly calls the SysFreeString() function on the parameter if it is not pointing to NULL.
RESOLUTION
<script type="text/javascript">loadTOCNode(1, 'resolution');</script>
This problem was corrected in ADO 2.5.
For earlier versions of ADO, call the raw_GetString directly and pass a BSTR pointer that points to NULL as the output parameter, or create a wrapper function as described in the "More Information" section.
For earlier versions of ADO, call the raw_GetString directly and pass a BSTR pointer that points to NULL as the output parameter, or create a wrapper function as described in the "More Information" section.
STATUS
<script type="text/javascript">loadTOCNode(1, 'status');</script>
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article.
This problem was corrected in ADO 2.5.
This problem was corrected in ADO 2.5.
MORE INFORMATION
<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>Steps to Reproduce the Behavior
<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> These steps use the SQL Server Pubs database:1. | Create a Win32 console application (Simple application) in Visual C++. |
2. | Paste the following code to replace code generated in the .cpp file: Note You must change User ID=<username> and Password =<strong password> to the correct values before you run this code. Make sure that User ID has the appropriate permissions to perform this operation on the database. #include "stdafx.h" |
3. | Run the code and observe the results. |
Resolution
<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>• | Use ADO 2.5 -or- |
• | Call the raw_GetString() function directly with a BSTR pointer that is initialized to point to NULL. Use the following code to replace the call to GetString(): BSTR bstrResult = NULL;-or- |
• | Create an inline function similar to GetString() that calls the raw_GetString function, but initialize the BSTR variable to NULL. Note: Do not modify the generated .tli file to make the changes directly to the GetString() wrapper implementation because this file is gegenerated at compile time. Instead, use the function below or copy and paste the GetString() function from the .tli file and modify it as follows: inline _bstr_t GetString2 ( _RecordsetPtr pRs, enum StringFormatEnum StringFormat, long NumRows, _bstr_t ColumnDelimeter, _bstr_t RowDelimeter, _bstr_t NullExpr )You can call this function in the main() function as follows: btRecordset = GetString2(pRs,adClipString,-1,L",",L"/r/n",L"<NULL>"); |