高分求救:用ATL跨进程组件(此组件主要用做界面)怎样实现回调?急!!!

zxmam 2008-06-03 08:58:01
如题,我想在ATL组件里生成一继承于COleControl的类好做界面方面的东西,如处理图形,用列表控件显示外部进程传进来的数据等;然后当我在组件里进行了相应动作想让调用此组件的外部进程客户端知道并做对应处理事情即组件回调.
(我原来用MFC ACTIVE做过,向导会自动生成*PropPage.h(cpp),*Ctrl.h(cpp),*.idl,*.def等文件,其中*Ctrl.h(cpp)就做界面方面很方便,但这生成的好象是DLL模式属于进程内组件,我现在想做跨进程的,在VC.NET2005中向导没发现有这样的类,不知怎做).
不知道应该怎样实现最好能介绍点代码,万分感谢!
...全文
278 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxmam 2008-06-06
  • 打赏
  • 举报
回复
怎么挂两天了也没人瞥下啊.偶实在没办法了啊,救救偶吧
zxmam 2008-06-05
  • 打赏
  • 举报
回复
现在我想急先解决界面的问题,能否给简单例子实现:
1.建立一MFC EXE COM组件C,在里边自己编写个继承于CWND的类A,里边有一成员变量是列表控件(用于显示客户端传来的数据).
2.在COM添加一对外接口I,添一接口方法FUNC1用于创建显示A;如果要从客户端获得父窗口和显示区域大小时加两参数CWND,CRECT,否则不加参数获得组件CWND和CRECT已创建CWND A.
3.客户端MFC程序有一对话框里调用上面COM C,调用接口I方法FUNC1以创建COM于对话框里.
zrhown 2008-06-05
  • 打赏
  • 举报
回复
可以在建立工和的时候支技连接点,这样就可以实行回调了!
zxmam 2008-06-05
  • 打赏
  • 举报
回复
有知道的没,帮帮忙,跪谢了.
zxmam 2008-06-04
  • 打赏
  • 举报
回复
能不能具体点,给点示例代码啊
zxmam 2008-06-04
  • 打赏
  • 举报
回复
不好意思,忘说了,我现在试的是ATL用MFC.这两天都试晕了,一会ATL一会又MFC组件可没看到一种有效的方法,就我上面提的一个最简单的界面都没法正确显示,出路在哪里啊.
jameshooo 2008-06-04
  • 打赏
  • 举报
回复
晕菜,都说了AX组件只能使用DLL(OCX),不能使用EXE
jameshooo 2008-06-04
  • 打赏
  • 举报
回复
如果你的组件是有窗口的,你可以直接把组件的窗口句柄当作父窗口句柄;如果组件是无窗口的,可以获得容器窗口作为父窗口句柄。
longjing_g 2008-06-04
  • 打赏
  • 举报
回复
用连接点
zxmam 2008-06-04
  • 打赏
  • 举报
回复
我都搞晕了,还是没法显示.我现在就连最简单的一个窗口都没法显示出来.
如我用ATL向导生成一EXE类型的组件,自己写了一继承于CWND的类CMyWnd,然后用向导建一简单对象接口Csvr,再对CSVR添加一接口show(BSTR a)想传递HWND
实现如下:
CRect rct;
HWND hP=(HWND)pParent;
CWnd *p=CWnd::FromHandle(hP);
p->GetClientRect(&rct);
m_wnd1.Create("","",WS_VISIBLE|WS_CHILD,rct,p,10000);

客户端是建的一基于对话框的MFC程序在一按钮点击时实现:
HRESULT hR=NULL;
hR=::CoInitialize(NULL);
if (FAILED(hR))
{
TRACE("CoInitialize error!\n");
return;
}
hR=::CoCreateInstance(CLSID_sevr1,NULL,CLSCTX_SERVER,IID_Isevr1,(void**)&pIsvr);
if (FAILED(hR))
{
TRACE("CoCreateInstance error!\n");
return;
}
USES_CONVERSION;

1: hR=pIsvr->ShowWnd1((BSTR)this->m_hWnd);
if (FAILED(hR))
{
TRACE("Create error!\n");
return;
}
可是运行1后就挂了.啥都显示不出来.到底怎实现啊?能否给个最简单例子啊.
jameshooo 2008-06-04
  • 打赏
  • 举报
回复
组件自己有窗口的话自己去找找怎么得到窗口。
如果组件是无窗口的,这样得到容器窗口:
IOleObject::GetClientSite --> IOleClientSite
IOleClientSite::QueryInterface --> IOleInPlaceSite
IOleInPlaceSite::GetWindow 可以得到容器窗口句柄
stivenjia 2008-06-03
  • 打赏
  • 举报
回复
我知道ATL下有两种事件感知方式:事务连接点、回调接口。第一种MS推荐的第二种MS不推荐的。
但是往往MS不主张的速度都很快。
jiqing_gao 2008-06-03
  • 打赏
  • 举报
回复
up
jameshooo 2008-06-03
  • 打赏
  • 举报
回复
既然你的类不继承任何基类,你怎么能(CWnd*)this呢?
zxmam 2008-06-03
  • 打赏
  • 举报
回复
还有就是界面问题.比如我定义一不继承任何基类的普通类,在里边所有大部分都是通过CDC画出,但里边我声明了一CListCtrl *plist;我在ondraw第一次创建它,但发现老没有显示出来,创建参数如:Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS,m_rcLstCtrl,(CWnd*)this,1);其中rcLstCtrl为起位置区域CRect;
我试过把(CWnd*)this换成AfxGetApp()->GetMainWnd()可以显示,但那不是想要的效果,因为它显示在主框架上去了.郁闷啊
zxmam 2008-06-03
  • 打赏
  • 举报
回复
能不能给点例子啊,我上面做的类就是将列表控件做为它的成员变量,但没法指定其父窗口指针,因为父类就是这个类啊.而这个类很多其它的东西都是用DC DRAW出来的.弄了两天了,越搞越晕.
jameshooo 2008-06-03
  • 打赏
  • 举报
回复
可以在类里面放置列表控件作为成员变量,当然也能添加代表父窗口指针的成员变量
zxmam 2008-06-03
  • 打赏
  • 举报
回复
那怎办,这么说我的这个类没法用列表之类的控件了?总不会靠代码画出想列表样的东西吧,那不是太不方便了.这组件到底怎规划啊.现在搞得偶都糊涂了,这组件都没法做界面吗?
jameshooo 2008-06-03
  • 打赏
  • 举报
回复
VC提供了向导来创建连接点。
对于组件,选择添加连接点,然后添加连接点的方法,向导自动生成idl中的连接点描述,同时生成Fire***的调用连接点封装代码。
对于客户端,选择实现连接点,选择组件中的连接点,向导自动生成连接点的实现。
zxmam 2008-06-03
  • 打赏
  • 举报
回复
连接点怎么实现,我对COM了解还较浅,能说具体点吗?比如说在组件里和客户端里的实现代码.
加载更多回复(12)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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