社区
ATL
帖子详情
>>>对面的高手看过来:如何取得控件的LPDISPATCH???
RickeyLau
2002-05-15 10:03:23
当向工程添加了一个控件A后,vc会自动为控件生成一些包装类,其中一个最主要的控件类CA是从CWnd派生,其他的是从COleDispatchDriver派生,现在我为控件定义了一个变量m_ca,其类型当然是那个从CWnd派生的控件类CA。但后来有一个问题,另外一个控件类的成员函数需要一个LPDISPATCH类型的参数,如何将m_ca转化为LPDISPATCH类型??可以吗?
...全文
159
9
打赏
收藏
>>>对面的高手看过来:如何取得控件的LPDISPATCH???
当向工程添加了一个控件A后,vc会自动为控件生成一些包装类,其中一个最主要的控件类CA是从CWnd派生,其他的是从COleDispatchDriver派生,现在我为控件定义了一个变量m_ca,其类型当然是那个从CWnd派生的控件类CA。但后来有一个问题,另外一个控件类的成员函数需要一个LPDISPATCH类型的参数,如何将m_ca转化为LPDISPATCH类型??可以吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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()。
LP
DISPATCH
类型的接属性值,方法
`
LP
DISPATCH
`是`I
Dispatch
*`的typedef,通常在自动化服务器和脚本环境中使用,如VBA(Visual Basic for Applications)和ActiveX
控件
。 要为`
LP
DISPATCH
`类型的接口设定或获取属性值,我们需要使用`I
Dispatch
::...
MFCDisp_
LP
DISPATCH
_modern54l_Vc_
这个压缩包"**MFCDisp_
LP
DISPATCH
_modern54l_Vc_**"显然包含了与在VC++(Visual C++)环境中使用
LP
DISPATCH
属性来操作I
Dispatch
接口相关的源代码示例。 **
LP
DISPATCH
**是微软定义的一个指向I
Dispatch
接口的长指针,...
Microsoft Web Browser
控件
demo
【Microsoft Web Browser
控件
demo】 在Windows应用程序开发中,Microsoft Web Browser
控件
是一个非常有用的工具,它允许开发者在他们的应用程序中嵌入一个完整的Internet Explorer浏览器引擎。这个
控件
是基于...
IE
控件
一些高级使用方法
在IT领域,尤其是在Windows应用程序开发中,Internet Explorer (IE)
控件
是一个常用组件,它允许开发者在他们的应用程序中嵌入Web浏览器的功能。本篇将详细探讨IE
控件
的一些高级使用方法,这些方法主要来源于VC++的...
基于对话框MFC程序,使用浏览器
控件
显示网页样例
在本文中,我们将深入探讨如何在基于对话框的MFC(Microsoft Foundation Classes)程序中集成WebBrowser
控件
,以显示网页内容。MFC是Microsoft提供的一套C++库,用于简化Windows应用程序的开发。通常,对话框式MFC...
ATL
3,248
社区成员
48,531
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章