VC 在线程里面初始化m_pRecordset失败

lang14 2012-04-08 04:57:31
情况是这样的
UINT myThread(LPVIOD pParam)
{
CMyDlg *pDlg=(CMyDlg*)pParam;
pDlg->fun();
}

CMyDlg::fun()
{
…………
…………//数据库已经在这里连接了
HRESULT hr = m_pRecordset.CreateInstance(__uuidof(Recordset));
…………
}

为什么hr返回的都是负数???还有就是我把fun()函数放到类成员函数里面一切正常,一放到线程里面就出错
求高人解答
...全文
138 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lang14 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
是因为线程相当于一个进程,和类是独立的,所以你在类里定义的变量在使用时或不能识别,就算经过处理后能识别了,也不是和类里的变量一致,因为经过处理后的能被线程识别的变量是另开个地址空间,和类里的变量不在一个地址空间.因此你还得在线程里加上AfxOleInit();//才行.
在APP类里加上通用各类都使用的变量没错,我都是这么做,我上面的说的不在APP类里定义,是因为我刚回复后就看到你说OPEN……
[/Quote]

非常感谢!!!
终于明白了,
同样感谢回答的大侠
hdg3707 2012-04-08
  • 打赏
  • 举报
回复
你可以把线程和你的主程序当成两个独立的程序理解就明白了,所以你在主程序里加上了AfxOleInit();这条语句,但对线程却无效,还得在线程里再加上才行
hdg3707 2012-04-08
  • 打赏
  • 举报
回复
是因为线程相当于一个进程,和类是独立的,所以你在类里定义的变量在使用时或不能识别,就算经过处理后能识别了,也不是和类里的变量一致,因为经过处理后的能被线程识别的变量是另开个地址空间,和类里的变量不在一个地址空间.因此你还得在线程里加上AfxOleInit();//才行.
在APP类里加上通用各类都使用的变量没错,我都是这么做,我上面的说的不在APP类里定义,是因为我刚回复后就看到你说OPEN出错,所以又加上下面的让你再定义全局变量试试.
shn521 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:
UINT myThread(LPVIOD pParam)
{
AfxOleInit();//加上这句试试


CMyDlg *pDlg=(CMyDlg*)pParam;
pDlg->fun();
}



可以了,谢谢了,
但是我想知道为什么加AfxOleInit();这个函数就可以了呢??想知道原因,哈哈~~~~
[/Quote]
组件初始化,初始化后才可以用
lang14 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
m_pConnection不要在APP类里定义,和m_pRecordset在一个地方定义,如果还不行,就把这两个变量定义成全局变量,和任何类都无关
[/Quote]

我写这个程序是接别人的,别人前两天走了,留下一堆问题, 在APP里面定义有什么不好的地方?
lang14 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
UINT myThread(LPVIOD pParam)
{
AfxOleInit();//加上这句试试


CMyDlg *pDlg=(CMyDlg*)pParam;
pDlg->fun();
}
[/Quote]

可以了,谢谢了,
但是我想知道为什么加AfxOleInit();这个函数就可以了呢??想知道原因,哈哈~~~~
hdg3707 2012-04-08
  • 打赏
  • 举报
回复
m_pConnection不要在APP类里定义,和m_pRecordset在一个地方定义,如果还不行,就把这两个变量定义成全局变量,和任何类都无关
hdg3707 2012-04-08
  • 打赏
  • 举报
回复
UINT myThread(LPVIOD pParam)
{
AfxOleInit();//加上这句试试


CMyDlg *pDlg=(CMyDlg*)pParam;
pDlg->fun();
}

lang14 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
前面加上这一段 试试

_AFX_THREAD_STATE* pState = AfxGetThreadState();
if(!pState->m_bNeedTerm)
AfxOleInit();

HRESULT hr = m_pRecordset……
[/Quote]
加上这几句话确实返回成功了,但是m_pRecordset->Open(_variant_t(strSQL),
theApp.m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
这个Open出错,执行不下去
shn521 2012-04-08
  • 打赏
  • 举报
回复
AfxOleInit();
zgl7903 2012-04-08
  • 打赏
  • 举报
回复
前面加上这一段 试试

_AFX_THREAD_STATE* pState = AfxGetThreadState();
if(!pState->m_bNeedTerm)
AfxOleInit();

HRESULT hr = m_pRecordset……

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧