Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как в ADO передать Connection подпроцессу?

14K
13 ноября 2005 года
Grob
3 / / 13.11.2005
Народ, кто знает, как передать _ConnectionPtr через рамки подпроцесса?
Использование прямого указателя m_pDBConnection на _ConnectionPtr в дочернем подпроцессе дает 'access violation' при попытке открытия _RecordsetPtr:

 
Код:
_RecordsetPtr rset("ADODB.Recordset");
rset->Open("SELECT * FROM Authors",(IDispatch*)m_pDBConnection, adOpenDynamic, adLockOptimistic, adCmdText);
2.4K
13 ноября 2005 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by Grob
Народ, кто знает, как передать _ConnectionPtr через рамки подпроцесса?
Использование прямого указателя m_pDBConnection на _ConnectionPtr в дочернем подпроцессе дает 'access violation' при попытке открытия _RecordsetPtr:

 
Код:
_RecordsetPtr rset("ADODB.Recordset");
rset->Open("SELECT * FROM Authors",(IDispatch*)m_pDBConnection, adOpenDynamic, adLockOptimistic, adCmdText);




Параметр дб variant

m_pRecordset->Open( "SELECT * FROM Authors" , _variant_t((IDispatch*)m_pDBConnection, true) , adOpenDynamic, adLockOptimistic , adCmdText );

14K
13 ноября 2005 года
Grob
3 / / 13.11.2005
Сделал. Дает то же самое исключение (access violation) в строке
V_DISPATCH(this)->AddRef();

Код:
// Construct a VT_DISPATCH VARIANT from an IDispatch*
//
inline _variant_t::_variant_t(IDispatch* pSrc, bool fAddRef) throw()
{
    V_VT(this) = VT_DISPATCH;
    V_DISPATCH(this) = pSrc;

    // Need the AddRef() as VariantClear() calls Release(), unless fAddRef
    // false indicates we're taking ownership
    //
    if (fAddRef) {
        V_DISPATCH(this)->AddRef(); //  <---- Access violation
    }
}


Когда я передавал сокет (CSocket) дочернему потоку, там все осуществлялось через методы Detach()/Attach(), так как прямая передача указателя на объект типа между потоками запрещена. Посему указатель на сокет передается через его HANDLE, что и делает Attach(). Вот я и думаю - может быть и здесь кроется та же причина?
В COM'e я не силен и в справке не могу ничего отыскать на эту тему :(
2.4K
13 ноября 2005 года
dinasok51
219 / / 12.11.2005
Посмотри на все include
эти должны быть

#include <afxdisp.h>
#include <comdef.h>
#include "icrsint.h"

но дб выдержана определенная последовательность этих includ'ов
сейчас не могу сказать какая точно
поиграйся сам.

это работает все выписываю из моих рабочих программ

Кроме того внимательно смотри за
#import ... msado15.dll" rename("EOF", "EndOfFile")

Какая версия Visual Studio у тебя?
14K
16 ноября 2005 года
Grob
3 / / 13.11.2005
Нашел-таки, в чем была трабла.
dinasok51, большое спасибо за поддержку!
Выяснилось, всему виной мои кривые ручки)) Код прекрасно работает в исходном варианте без никаких добавлений. Просто указатель на соединение затерялся среди кучи классов и не был правильно прописан в конструкторе одного из них. Однако сам тип ошибки, плюс - отсутствие опыта в COM'е заставил потерять кучу времени... Впрочем, не скажу что зря.
Пишу под VC6, MFC. Потоки наследованы из CWinThread. Может быть поэтому интерфейс-пойнтеры не нуждаются в маршаллинге, как про это описывали здесь.
Век живи - век дебагь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог