_RecordsetPtr rset("ADODB.Recordset");
rset->Open("SELECT * FROM Authors",(IDispatch*)m_pDBConnection, adOpenDynamic, adLockOptimistic, adCmdText);
Как в ADO передать Connection подпроцессу?
Использование прямого указателя m_pDBConnection на _ConnectionPtr в дочернем подпроцессе дает 'access violation' при попытке открытия _RecordsetPtr:
Код:
Цитата:
Originally posted by Grob
Народ, кто знает, как передать _ConnectionPtr через рамки подпроцесса?
Использование прямого указателя m_pDBConnection на _ConnectionPtr в дочернем подпроцессе дает 'access violation' при попытке открытия _RecordsetPtr:
Народ, кто знает, как передать _ConnectionPtr через рамки подпроцесса?
Использование прямого указателя m_pDBConnection на _ConnectionPtr в дочернем подпроцессе дает 'access violation' при попытке открытия _RecordsetPtr:
Код:
_RecordsetPtr rset("ADODB.Recordset");
rset->Open("SELECT * FROM Authors",(IDispatch*)m_pDBConnection, adOpenDynamic, adLockOptimistic, adCmdText);
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 );
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
}
}
//
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 я не силен и в справке не могу ничего отыскать на эту тему :(
эти должны быть
#include <afxdisp.h>
#include <comdef.h>
#include "icrsint.h"
но дб выдержана определенная последовательность этих includ'ов
сейчас не могу сказать какая точно
поиграйся сам.
это работает все выписываю из моих рабочих программ
Кроме того внимательно смотри за
#import ... msado15.dll" rename("EOF", "EndOfFile")
Какая версия Visual Studio у тебя?
dinasok51, большое спасибо за поддержку!
Выяснилось, всему виной мои кривые ручки)) Код прекрасно работает в исходном варианте без никаких добавлений. Просто указатель на соединение затерялся среди кучи классов и не был правильно прописан в конструкторе одного из них. Однако сам тип ошибки, плюс - отсутствие опыта в COM'е заставил потерять кучу времени... Впрочем, не скажу что зря.
Пишу под VC6, MFC. Потоки наследованы из CWinThread. Может быть поэтому интерфейс-пойнтеры не нуждаются в маршаллинге, как про это описывали здесь.
Век живи - век дебагь!