C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Специфика вызова CoCreateInstance изVisualиBuilder, В зависимости от среды ф-я работает/нет
** iAlexander
Отправлено: 04.08.2004, 17:00


Не зарегистрирован







Уважаемые корифеи !
Помогите разрешить такую проблему:

Мне необходимо получать историю url'ов IExplor'a. Это возможно следующим образом:
CODE
extern "C" __declspec(dllexport) BOOL GetIEHistory(void *iHistData)
   {
       IUrlHistoryStg2Ptr    history;
       IEnumSTATURLPtr        enumPtr;
       STATURL url;

       if(FAILED(CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg2,(void**)&history)))
       {
           return false;
       }

       if(FAILED(history->EnumUrls(&enumPtr)))
           return false;
     
       while(SUCCEEDED(enumPtr->Next(1,&url,&uFetched)))
       {
           // do something with url...
       };
return true;
};

CoCreateInstance инициализирует history, а EnumUrls подготавливает enumPtr к перечислению.
В Visual схема прекрасно работает, в Builder 5 же CoCreateInstance с ходу возвращает false.
Решил обойти следующим образом: сделаю-ка я dll в Visual, и буду ее из Билдера подгружать. Прошел через тернии создания в Visual dll и внедрения ее в Билдер, но вот сюрприз — GetIEHistory при вызове ее из dll из Билдера и тут возвращает false.
Возможно ли как-то исправить ситуацию? Или мне придется отказаться от Билдера. Это будет очень неприятно, сделать программу в Visual при полном отутствии опыта будет весьма сложно...
olegenty
Отправлено: 05.08.2004, 06:49


Ветеран

Группа: Модератор
Сообщений: 2412



Сравни. Писалось в том году, какой проставлен, с тех пор я всё забыл напроч. Но код работал на ура. Именно на Builder. Хотя, в твоём коде на первый взгляд ошибок не видно...
CODE

//////////////////////////////////////////////////////////////////////////////
//
//  Wrapper для ADODB.Connection (2.1)
//
//  Реализация от 02.08.2000, Олег А. Евсеев
//
CAdoConnection::CAdoConnection(const wchar_t *pwcConnection,
                              const wchar_t *pwcUser,
                              const wchar_t *pwcPassword)
{
   m_pwcConnection = new wchar_t[wcslen(pwcConnection) + 1];
   wcscpy(m_pwcConnection, pwcConnection);

   m_pwcUser = new wchar_t[wcslen(pwcUser) + 1];
   wcscpy(m_pwcUser, pwcUser);

   m_pwcPassword = new wchar_t[wcslen(pwcPassword) + 1];
   wcscpy(m_pwcPassword, pwcPassword);

   m_piConn = NULL;
   HRESULT hr = CoCreateInstance(CLSID_ADOConnection,
                                 NULL,
                                 CLSCTX_INPROC_SERVER,
                                 IID__ADOConnection,
                                 (void **)(&m_piConn));
   if (!SUCCEEDED(hr))
   {
       char *szErrorMessage = "Ошибка получения указателя на интерфейс\n";
       strcat(szErrorMessage, "ADODB.Connection (2.1)");
       MessageBox(NULL,
                  szErrorMessage,
                  "ОШИБКА :-(",
                  MB_SYSTEMMODAL + MB_ICONERROR);
       exit(EXIT_FAILURE);
   }
}

Вернуться в Вопросы программирования в C++Builder