社区
ATL
帖子详情
>>>对面的高手看过来:如何取得控件的LPDISPATCH???
RickeyLau
2002-05-15 10:03:23
当向工程添加了一个控件A后,vc会自动为控件生成一些包装类,其中一个最主要的控件类CA是从CWnd派生,其他的是从COleDispatchDriver派生,现在我为控件定义了一个变量m_ca,其类型当然是那个从CWnd派生的控件类CA。但后来有一个问题,另外一个控件类的成员函数需要一个LPDISPATCH类型的参数,如何将m_ca转化为LPDISPATCH类型??可以吗?
...全文
205
9
打赏
收藏
>>>对面的高手看过来:如何取得控件的LPDISPATCH???
当向工程添加了一个控件A后,vc会自动为控件生成一些包装类,其中一个最主要的控件类CA是从CWnd派生,其他的是从COleDispatchDriver派生,现在我为控件定义了一个变量m_ca,其类型当然是那个从CWnd派生的控件类CA。但后来有一个问题,另外一个控件类的成员函数需要一个LPDISPATCH类型的参数,如何将m_ca转化为LPDISPATCH类型??可以吗?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zxs218
2002-05-17
打赏
举报
回复
我说这样的语句是不会出错的,是因为这时的IDispatch对象不可能被释放,
因为我们是引用了控件的IDispatch接口对象,这时控件是不可能被释放的。
当然这种做法也有一定的危险,最好是
lpunknown->QueryInterface(IID_IDispatch,(void**)&lpdisp);
...
pV->m_ddacQueryResult.GetPreview().SetViewer(lpdisp);
pV->m_ddacQueryResult.GetPreview().Refresh();
lpdisp->Release();
但这样会要求保存一个类范围的变量,为了省事所以没有那样做。
但我想这样做是不会有问题的。
zxs218
2002-05-17
打赏
举报
回复
楼上 看看rickeylau(RickeyLau)的贴子。
The interface pointer returned by GetControlUnknown is not reference-counted.
Lostinet
2002-05-17
打赏
举报
回复
不是把。。楼上
lpdisp是Query回来的
IDispatch不释放是lpunknown还没有释放的原因
你能保证这样不?出错?
这样写才行吧?
lpunknown->QueryInterface(IID_IDispatch,(void**)&lpdisp);
lpunknown->Release();
pV->m_ddacQueryResult.GetPreview().SetViewer(lpdisp);
pV->m_ddacQueryResult.GetPreview().Refresh();
lpdisp->Release();
RickeyLau
2002-05-16
打赏
举报
回复
但msdn上说:
The interface pointer returned by GetControlUnknown is not reference-counted. Do not callIUnknown::Release on the pointer unless you have previously calledIUnknown::AddRef on it.
zxs218
2002-05-16
打赏
举报
回复
CWnd::GetControlUnknown这个得到的是IUnknown接口,
通过IUnknown的QueryInterface方法获取IDispatch接口。
LPUNKNOWN lpunknown=m_arviewPrintPreview.GetControlUnknown();
LPDISPATCH lpdisp=NULL;
lpunknown->QueryInterface(IID_IDispatch,(void**)&lpdisp);
// 这时需要调用
lpunknown->Release();
...
// 在LPDISPATCH使用完成后也要调用
lpdisp->Release();
zxs218
2002-05-16
打赏
举报
回复
sorry ,
我弄错了,你说得对。
但是QueryInterface的接口还是必须调用Release()的;
你可以这样:
lpunknown->QueryInterface(IID_IDispatch,(void**)&lpdisp);
lpdisp->Release();
pV->m_ddacQueryResult.GetPreview().SetViewer(lpdisp);
pV->m_ddacQueryResult.GetPreview().Refresh();
这样的语句是不会出错的,因为这时的IDispatch对象不会被释放。
RickeyLau
2002-05-15
打赏
举报
回复
我刚测试了一下,发现对于同一个自动化对象,使用
CCmdTarget::GetIDispatch的IDispatch指针,和使用
CWnd::GetControlUnknown,得到的IDispatch指针不相等,
到底哪个是对的呢?为什么会有这样的情况,???
RickeyLau
2002-05-15
打赏
举报
回复
多谢啦!!!
基本上可以啦,但还是有一个小问题,就是该窗口退出的时候会出错,是在控件的析构函数中,好像是关于引用计数的问题。
以下是我的代码:
LPUNKNOWN lpunknown=m_arviewPrintPreview.GetControlUnknown();
LPDISPATCH lpdisp=NULL;
lpunknown->QueryInterface(IID_IDispatch,(void**)&lpdisp);
//是不是这样用???
pV->m_ddacQueryResult.GetPreview().SetViewer(lpdisp);
pV->m_ddacQueryResult.GetPreview().Refresh();
另外一个问题,为什么用GetIDispatch直接取得控件对象的IDispatch接口就不行呢?而用GetControlUnknown得到IUnknown接口再查询出IDispatch就可以呢?
arxing
2002-05-15
打赏
举报
回复
CWnd::GetControlUnknown()。
I
Dispatch
接口的
LP
Dispatch
属性
IFileInfo *fileInfo=NULL;
LP
DISPATCH
lp
Disp; HRESULT hr;
lp
Disp=m_edit.get_FileInfo(); //m_edit-vc的dll
控件
的变量 hr=
lp
Disp-> QueryInterface(IID_I
Dispatch
,(void **)&fileInfo); if (FAILE
关于c++中GetIDsOfNames与Invoke的使用~
最近在学习com接口,和A
控件
,当中有一个函数得到的值为一个
LP
DISPATCH
指针,所以在这跟大家分享一下,怎么通过
LP
DISPATCH
指针来调用com接口中的函数对象。 首先
LP
DISPATCH
指向的是个com接口对象,我们可以先查到这个指针指向的接口它有哪些参数和方法,比如我这个! 由此可见它的指向的是一个IMXDRAWRESBUF接口,接着我们再查查其中有哪些方法,如下: 发现里面有
VC6下使用WebLink
控件
这是今年6月7号我的一篇日志,好像还有些参考价值,誊到blog上来吧。 最终我在VC6下面搞定了WebLink,与以往一样,论坛和MSDN是我最大的帮手。在ESRI官方论坛那可怜的四五个关于VC6+WebLink的帖子中,我找到了困扰我多天的问题的答案。 在做现在这个影像数据服务项目的整个过程中,我一共在三个平台下面使用过WebLink
控件
,从VB6到.net,再回到...
用Chart
控件
绘制动态图表(转载)
用Chart
控件
绘制动态图表北京邮电大学 刘瑞芳 进行程序设计时,选用一个合适的ActiveX
控件
,有时可大大减少编程工作量。ActiveX
控件
(又称OCX)基于COM技术,作为独立的软件模块,它可以在任何程序设计语言中插入使用。本文仅以VC++为例说明Chart
控件
的使用。 Chart
控件
指Mschart.ocx(5.0版)或Mschrt20.ocx(6.0 版),是Vi
ActiveX
控件
的MFC设计之旅-第13步
这一步我们将持久化一个接口,可能有些难度,因为用到了很多前面讲过的东西。在第1步中,我们就实现了一个具有层次结构的
控件
,但是,我们并没有给这个
控件
提供持久化,更不用说,持久化
控件
的所有层次了。在上一步中,实现了一个标准的图片接口(IPictureDisp)的持久化在这一步中,会综合第一步和上一步中的内容,实现一个我们自定义的接口的持久化。仍旧采用上一步中的Topp例子(和上一步的内容基本独立,可以
ATL
3,248
社区成员
48,530
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章