• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > COM技术内幕里关于继承的一个问题

COM技术内幕里关于继承的一个问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了com技术内幕,com技术内幕pdf,com技术,微软com技术,com组件技术等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: COM技术内幕里关于继承的一个问题
描述:

在COM 技术内幕里有这样一段代码,如下:
#include <iostream.h>
#include <objbase.h>
void trace(const char* msg) {cout<<msg<<endl;}
interface IX : public IUnknown
{
virtual void __stdcall FX() = 0;
};
interface IY : public IUnknown
{
virtual void __stdcall FY() = 0;
};
interface IZ : public IUnknown
{
virtual void __stdcall FZ() = 0;
};
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
 
class CA : public IX, public IY 
{
virtual HRESULT __stdcall QureyInterface(const IID& idd, void** ppv);
virtual ULONG __stdcall AddRef() { return 0;}
virtual ULONG __stdcall Release() { return 0;}
virtual void __stdcall FX() { trace("FX"); }
virtual void __stdcall FY() { trace("FY"); }
};
HRESULT __stdcall CA::QureyInterface(const IID& idd, void** ppv)
{
if( idd == IID_IUnknown )
{
trace("QureyInterface: Return a pointer to IUnknown");
*ppv = static_cast<IX*> (this);
}
else if( idd == IID_IX )
{
trace("QureyInterface: Return a pointer to IX");
*ppv = static_cast<IX*> (this);
}
else if( idd == IID_IY )
{
trace("QureyInterface: Return a pointer to IY");
*ppv = static_cast<IY*> (this);
}
else
{
trace("QureyInterface: Interface not support");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*> (*ppv)->AddRef();
return S_OK;
}
IUnknown* CreateInstance()
{   
IUnknown* pI = static_cast<IX*>( CA() );
pI->AddRef();
return pI;
}
// {A97B3092-70C2-4909-B3AD-E21E85BD3632}
static const IID IID_IX = 
{ 0xa97b3092, 0x70c2, 0x4909, { 0xb3, 0xad, 0xe2, 0x1e, 0x85, 0xbd, 0x36, 0x32 } };
// {4212198C-2D98-4e05-8557-FB082A8541F4}
static const IID IID_IY = 
{ 0x4212198c, 0x2d98, 0x4e05, { 0x85, 0x57, 0xfb, 0x8, 0x2a, 0x85, 0x41, 0xf4 } };
// {776683C7-AF1C-4b93-8DCF-8B29B2521E75}
static const IID IID_IZ = 
{ 0x776683c7, 0xaf1c, 0x4b93, { 0x8d, 0xcf, 0x8b, 0x29, 0xb2, 0x52, 0x1e, 0x75 } };
 
void main()
{
HRESULT hr;
trace("Client     Get an Iunknown pointer.");
IUnknown* pIUnknown = CreateInstance();
trace("Client     Get interface IX.");
IX* pIX = NULL;
hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
if( SUCCEEDED(hr) )
{
trace("Client  Succeed in getting IX");
pIX->FX();
}
trace("Client     Get interface IY.");
IY* pIY = NULL;
hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
if( SUCCEEDED(hr) )
{
trace("Client  SUCCEEDED in getting IY");
pIY->FY();
}
trace("Client     Get interface IZ.");
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ, (void**)&pIZ);
if( SUCCEEDED(hr) )
{
trace("Client  SUCCEEDED in getting IZ");
pIZ->FZ();
}
else 
{
trace("Can not get interface IZ");
}
}
可是我这样运行后却提示 CA无法实例化抽象类,这是为什么啊。CA里所有的虚函数都已经定义了啊。


解决方案1:

估计是你打错了,代码本身没什么问题。

解决方案2:

你的程序就这一个错误吗?我刚才按照自己的理解编了一下,没有错啊,运行结果对。书上有extern const IID IID_IX;extern const IID IID_IY;extern const IID IID_IZ;这三行,我认为extern用的不对,我没有用这三行,直接写了// {A97B3092-70C2-4909-B3AD-E21E85BD3632}
static const IID IID_IX = 
{ 0xa97b3092, 0x70c2, 0x4909, { 0xb3, 0xad, 0xe2, 0x1e, 0x85, 0xbd, 0x36, 0x32 } };
// {4212198C-2D98-4e05-8557-FB082A8541F4}
static const IID IID_IY = 
{ 0x4212198c, 0x2d98, 0x4e05, { 0x85, 0x57, 0xfb, 0x8, 0x2a, 0x85, 0x41, 0xf4 } };
// {776683C7-AF1C-4b93-8DCF-8B29B2521E75}
static const IID IID_IZ = 
{ 0x776683c7, 0xaf1c, 0x4b93, { 0x8d, 0xcf, 0x8b, 0x29, 0xb2, 0x52, 0x1e, 0x75 } };
extern const的用法是多文件时,在一个文件里定义了常量,在别的文件里引用。自己再重新作一下了,祝你好运。

解决方案3:

Vc不支持这样的,一个CA接口继承了两个IUnknow


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • com技术内幕第五章例子问题
  • 哪有用com技术写的例子程序,包括com的实现和com的调用
  • 求<COM技术内幕>和<COM原理与应用>的源码
  • 求《COM技术内幕》随书的原代码
  • 求购《com技术内幕》一书
  • 《COM技术内幕》第7章例子的问题
  • com技术内幕中的示例问题?
  • 学习COM技术内幕时想弄清COM内的执行顺序,请大家帮忙解答,一部分自己已经弄清,大家也可以来学习指正
  • 现在的com相关的技术是发展到那个阶段了?
  • 求<COM技术内幕>和<COM原理与应用>的源码

相关文章

  • 2017-06-05 C#注册COM组件。
  • 2017-06-04 使用excelexe将编辑框数据倒入到excel时,提示“未找到宏“CopyRow””?
  • 2017-06-04 Activex的网页中,如何做到分栏
  • 2017-06-05 关于VS2010与mscomm控件的怨念,紧急求助。。
  • 2017-06-04 对COM接口一点肤浅的理解,说出来让大家评论一下,以抛砖引玉
  • 2017-06-05 我用installshield调用自己写的DLL,返回报错,请大家帮我看看怎么回事?
  • 2017-06-04 谁可以给我一个smtp的控件VB
  • 2017-06-05 在测试容器中找不到新创建的控件
  • 2017-06-05 创建线程,传递窗口句柄问题出在哪了?
  • 2017-06-04 买过《深入解析ATL(第二版)》的进来说下

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 问个组件调用组件的问题
    • 在服务程序中用GetUserName不能得到当前登录用户名字?
    • 我的对话框为什么收不到消息啊??
    • 类型库与IDL的奇怪问题,在线候
    • 怎样将一个vb对象通过接口传入vc中,再在vc中访问该对象?急
    • 如何在VC代码编辑区内右键出来的菜单中,添加自己定义的菜单,谢谢
    • 如何使进程无法结束?
    • 怎样做安装文件?
    • ASP与用Delphi编写的COM+之间如何传递数组类型的参数?
    • 初学COM一些不明白的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有