Преобразовать ADODB::Recordset^ в _RecordsetPtr

Я использую C# dll внутри в оболочке C++/CLI. DLL возвращает объект ADODB::Recordset^, но мне нужна оболочка для возврата объекта _RecordsetPtr. Как я могу конвертировать между двумя?

Вот что у меня так далеко. Проблема, с которой я сталкиваюсь, заключается в том, что после последней строки цикла for функция переходит к оператору return и завершается. Он не продолжает зацикливаться, и он не попадает в "Объект ^ строки = . . .". линия.

_RecordsetPtr TraserInterface::GetDistributorRecordset()
{
    ADODB::Recordset^ recordset = TraserWrapper::Instance->traserInterface->DistributorRecordset;
    ADODB::Fields^ fields = ((ADODB::RecordsetClass^)recordset)->default;
    HRESULT hr;
    _RecordsetPtr recordsetPtr("ADODB.Recordset");
    for (int i = 0; i < fields->Count; i++)
    {
        ADODB::Field^ field = fields[i];
        String^ fieldName = field->Name;
        _bstr_t bstrName = MarshalString(fieldName).c_str();
        int type = (int)field->Type;
        int definedSize = field->DefinedSize;
        int fieldAttrib = field->Attributes;
        hr = recordsetPtr->Fields->Append(bstrName, (DataTypeEnum)type, definedSize, (FieldAttributeEnum)fieldAttrib);
    }
    Object^ rows = recordset->GetRows((int)ADODB::GetRowsOptionEnum::adGetRowsRest, (Object^)ADODB::BookmarkEnum::adBookmarkFirst, (Object^)fields);
    // loop through rows and populate recordsetPtr . . .
    return recordsetPtr;
}

1 ответ

Решение

Благодаря Гансу Пассанту я смог найти решение:

_RecordsetPtr TraserInterface::GetDistributorRecordset()
{
    ADODB::Recordset^ recordset = TraserWrapper::Instance->traserInterface->DistributorRecordset);
    IntPtr recordsetIntPtr = Marshal::GetIUnknownForObject(recordset);
    IUnknown* unknown = (IUnknown*)(void*)recordsetIntPtr;
    _RecordsetPtr recordsetPtr(unknown);
    return recordsetPtr;
}
Другие вопросы по тегам