В прошлом шаге мы устанавливали свойства. После установки свойств Вам нужно выло вызвать Initialize() для инициализации провайдера. Но эта функция может и не произвести инициализацию. Надо бы убедиться, что инициализация все-таки прошла. Эта функция возвращает HRESULT:
HRESULT Initialize();
Возвратов может быть много. Но на нормальную инициализацию Вы получите S_OK. Давайте расширим наш пример. Проверим ошибки.
hr=pIDBInitialize->Initialize();
if (FAILED(hr))
{
cout << "Unable to initialize IDBInitialize" << endl;
switch (hr)
{
case DB_S_ASYNCHRONOUS:
cout "DB_S_ASYNCHRONOUS" << endl;
cout << "DB_S_ASYNCHRONOUS" << endl;
case DB_S_ERRORSOCCURRED:
cout << "DB_S_ERRORSOCCURRED" << endl;
break;
case E_FAIL:
cout << "E_FAIL" << endl;
break;
case E_OUTOFMEMORY:
cout << "E_OUTOFMEMORY" << endl;
break;
case E_UNEXPECTED:
cout << "E_UNEXPECTED" << endl;
break;
case DB_E_ALREADYINITIALIZED:
cout << "DB_E_ALREADYINITIALIZED" << endl;
break;
case DB_E_CANCELED:
cout << "DB_E_CANCELED" << endl;
break;
case DB_E_ERRORSOCCURRED:
cout << "DB_E_ERRORSOCCURRED" << endl;
break;
case DB_SEC_E_AUTH_FAILED:
cout << "DB_SEC_E_AUTH_FAILED" << endl;
break;
default:
cout << " ????? " << endl;
break;
}
pIDBInitialize->Release();
CoUninitialize();
return;
}
Так вот, если Вы запустите этот пример на 90% я уверен, что Вы получите
ошибку E_FAIL. И не Я не Вы в этом не виноваты. Мы же с Вами говорили,
что OLEDB это COM объекты ??? Говорили. Поищите в реестре строку
OLE_DB_NWind_Jet, так как именно этого провайдера мы пытались оживить.
Вот сдесь: // Второе
InitProperties[1].dwPropertyID = DBPROP_INIT_DATASOURCE;
InitProperties[1].vValue.vt = VT_BSTR;
InitProperties[1].vValue.bstrVal = SysAllocString(OLESTR("OLE_DB_NWind_Jet"));
Если ошибка есть, то скорее всего о нем не упоминается в реесте. Откуда его взять ??? Смотрите следующие шаги :-))