Здравствуйте Archie, Вы писали:
A>PSDK у меня стоит последнее...впрочем от версии PSDK это вряд ли зависит
То что идет с VC6 никуда не годится... из PSDK врде правильные.
A>...Особенность в том что после выхода из функции, где этот код написан, Recordset грохнется (или я неправ ?), а мне нужно его вернуть по указателю.
Recordset — COM-объект. Если AddRef не делать (по правилам COM-а), то грохнется, а если сделать, то должен нормально работать. Покрайней мере у нас есть функия:
[id(DISPID_LOCALCURSOR_GETADOCURSOR), helpstring("Получить ADORecordset, созданный на основе данных колонок курсора")]
HRESULT GetADORecordset(
[in, defaultvalue(-1)] long FirstRecord,
[in, defaultvalue(-1)] long RecordCount,
[out, retval] IDispatch **ADORecordset
);
// Реализация:
STDMETHODIMP CascCachedCursor::GetADORecordset(long FirstRecord, long RecordCount, IDispatch **ADORecordset)
{
if(ADORecordset == NULL)
return S_FALSE;
CComPtr<_Recordset> spAdoRs;
HRESULT hr = spAdoRs.CoCreateInstance(CLSID_Recordset);
ASC_RETURN_FAILED(hr);
hr = spAdoRs->put_CursorLocation(adUseClient);
ASC_RETURN_FAILED(hr);
CComPtr<IascColumns> spIascColumns;
hr = get_Columns(&spIascColumns);
ASC_RETURN_FAILED(hr);
CComPtr<Fields> spFields;
hr = spAdoRs->get_Fields(&spFields);
ASC_RETURN_FAILED(hr);
hr = InitADORecordsetFields(spFields, spIascColumns);
ASC_RETURN_FAILED(hr);
VARIANT svEmpty;
svEmpty.vt = VT_DISPATCH;
svEmpty.pdispVal = NULL;
hr = spAdoRs->Open(svEmpty, svEmpty,
adOpenUnspecified,
adLockUnspecified,
-1);
ASC_RETURN_FAILED(hr);
hr = InitADOFieldsValues(FirstRecord, RecordCount, spFields, spAdoRs);
ASC_RETURN_FAILED(hr);
hr = spAdoRs->Update(vtMissing, vtMissing);
ASC_RETURN_FAILED(hr);
hr = spAdoRs->MoveFirst();
ASC_RETURN_FAILED(hr);
return spAdoRs->QueryInterface(ADORecordset); // AddRef
}
Она создает и возвращает ADO-Recordset. Ну, и вроде работае.