В прошлом шаге мы устанавливали свойства. После установки свойств Вам нужно выло вызвать 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"));
Если ошибка есть, то скорее всего о нем не упоминается в реесте. Откуда его взять ??? Смотрите следующие шаги :-))