Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Ну во-первых, если вы, для своего ActiveX-объекта, самостоятельно реализуете объект ошибки с интерфейсом IErrorInfo.
КД>>>2. Объект с описанием ошибки был нестандартный и реализовывался не стандартным комом (в ole32.dll?), а в oledb32.dll. Естественно, интерфейс IErrorInfo у него был.
Vi2>А можно поподробнее о нестандартном объекте ошибок. Что это за объект, кто написал, кто создает и т.п.
В OLEDB есть собственная реализация объекта ошибки. Помимо IErrorInfo она реализует интерфейс IErrorRecords, что позволяет создавать коллекции ошибок. Создается этот объект через CoCreateInstance(CLSID_EXTENDEDERRORINFO,...). Создается OLEDB-провайдером, когда он хочет вернуть клиенту "правильный" объект OLEDB-ошибки. Устанавливается как обычная ошибка автоматизации через SetErrorInfo. Живет в oledb32.dll.
Помимо коллекции ошибок, этот объект еще хранит параметры ошибки, которые потом используются при формировании сообщения об ошибки (с учетом языка пользователя). То есть, создаешь такой объект-ошибки, запихиваешь в него параметры, а он потом передает эти параметры и lcid твоему другому "спец-объекту" OLEDB-провайдера с интерфейсом IErrorLookup, чтобы последний сформировал текст ошибки.
Vi2>Видишь ли, тут не предъявить претензии именно к CoUninitialize: она работает как умеет. Если кто-то не закрыл счетчик ссылок объекта и позволил серверу этого объекта уйти, вот этот кто-то — злобный буратино. Так что решение SetErrorInfo(0,NULL) уничтожает зловредное влияние этого "кто-то", а не CoUninitialize. Аналог этому действию — End в VB, когда приложение не думает завершаться по Unload.
Ха. Извините меня — я зарегистрировал в окружении COM-а объект-ошибку и он вызвал для нее AddRef. Все — он за неё отвечает. Клиент и, тем более, сам COM-объект (зарегистрировавший эту ошибку) за этот объект-ошибку не отвечают. За него отвечает окружение. Оно же вызывает, в конечном итоге, для него Relеase и соответственно нарывается на AV — так что оно (окружение) это понимает, но разработчик CoUninitialize тестировал только с тем объектом ошибки, который живет в ole32.dll.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --