好久不见了,问个问题送100分先!

vc_boy 2002-01-16 10:16:48
现在有这些类:CMyAPP(主程序类),CMyUser,CMyDlg
COM+对象:UserOperate

在CMyApp中有一个COM+对象的指针 IUserOperatePtr m_Operate
及一个初始函数InitComAndConnectToDB
在CMyApp的Instance()中调用此函数,此函数建立对象指针并与SQL库连接
class CMyApp : public CWinApp
{
....
public:
IUserOperatePtr m_Operate;
public:
InitComAndConnectToDB();
....
};


class CMyapp::InitComAndConnectToDB
{
m_Operate.Createinstance(.....);
m_Operate->Connect(....);
.....
}

CMyApp::InitInstance(..)
{
....
InitComAndConnectToDB();
};

CMyDlg类是一个对话框类,点击此对话框的OK按钮后有以下类似代码
CMyDlg::OnMyOK
{
......
AfxBeginThread(ThreadProc,...);
....
}
在ThreadProc函数中
ThreadProc(....)
{
.....
((CMyApp*)AfxGetApp())->m_Operate->GetUserData(...); <-此句有问题
....
}

-------------------------------------
问题:
当com+(DLL)对象在本地时,一切正常,但是当com+对象不在本地时(远程调用),((CMyApp*)AfxGetApp())->m_Operate->GetUserData(...)一句会报错,错误为:“消息筛选器拒绝此调用”不知是何原因,如果不建立新建程,即把ThreadProc中的代码移到OnMyOK中就一切正常,为何??
如果在新建的线程中重定义一个COM指针,然后建立它,调用其方法就正常,就是调用APP中的COM指针不行,为什么??
我又把m_Operater定义成全局变量后在新线程中调用也不行。
...全文
131 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc_boy 2002-01-18
  • 打赏
  • 举报
回复
to sunbo
问题已经解决了,将你的CoMarshalInterThreadInterfaceInStream(__uuidof(IUserOperate), m_Operate, &g_pStmPtr);函数改一下(将__uuidof(.....))换掉。

谢谢你给我的提示,接分吧
sunbo 2002-01-18
  • 打赏
  • 举报
回复
上述与线程类无关,给我看你的IDL与相应的代码框架。
brave_yh 2002-01-17
  • 打赏
  • 举报
回复
to oicq8(龙飞) 
做广告吗?
Terminator_wang 2002-01-17
  • 打赏
  • 举报
回复
"oicq8(龙飞)"这人有病!!!
flounder 2002-01-17
  • 打赏
  • 举报
回复
我也想知道
kjijian 2002-01-17
  • 打赏
  • 举报
回复
不懂,但关注
vc_boy 2002-01-17
  • 打赏
  • 举报
回复
我来试试看
vc_boy 2002-01-17
  • 打赏
  • 举报
回复
HRESULT hr = CoMarshalInterThreadInterfaceInStream(__uuidof(IUserOperate), m_Operate, &g_pStmPtr);
一句总是返回失败,是不是和我的组件的线程类别有关,如果是,如何更改它?
sunbo 2002-01-17
  • 打赏
  • 举报
回复
试试这个:

CMyDlg::OnMyOK
{
......
IStream* pStmPtr;
HRESULT hr = CoMarshalInterThreadInterfaceInStream(__uuidof(IUserOperate), m_Operate, &g_pStmPtr);
AfxBeginThread(ThreadProc,(LPVOID) pStmPtr);
....
}

在ThreadProc函数中
ThreadProc(LPVOID pParam )
{
.....
IStream* pStmPtr = (IStream*)pParam;
IUserOperatePtr operate1;
CoGetInterfaceAndReleaseStream(pStmPtr, __uuidof(IUserOperate), (void**)&operate1);
operate1->GetUserData(...);
....
}

oicq8 2002-01-16
  • 打赏
  • 举报
回复
www.ourcode.net 不是一个好站吗?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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