• 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 > 急!!ATL编程:给接口添加方法时如何使用自己写的类作为参数的类型

急!!ATL编程:给接口添加方法时如何使用自己写的类作为参数的类型

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

佚名通过本文主要向大家介绍了atl34砂轮,atl方形动力电池,atl80.dll官方下载,atl71.dll一键修复,atl等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 急!!ATL编程:给接口添加方法时如何使用自己写的类作为参数的类型
描述:

八百里加急!本人用ATL和MFC混合写一控件,添加了两个ATL简单对象,一个Table,另一个Field,因些有了两个接口一个ITable,另一个IField,现在我想给ITable加一个方法(添加字段的方法):AddField(IField* newField),想像左边写的这个样,将另一个接口(字段)作为参数传进去,请问高手,我要怎么弄才能搞定?因为方法支持普通的类型作为参数,我知道普通的怎么弄,也知道数组怎么作为参数传进去,但就是自己写的类和结构、枚举还不知道咋作为方法的参数类型,还有属性的类型,请专家指点一二呀!!!!搞不定可能要死人了!!


解决方案1:

看看徐颖的《COM编程精彩实例》
在*.idl中先创建你要的类,struct,union等。
在客户端可直接使用不再创建

解决方案2:

http://www.vckbase.com/document/viewdoc/?id=1259
原文出处:Passing C++ Object in ATL DLL
简介
  几个星期以前,我拼命的寻找一个能够通过COM接口传递C++对象的例子,但是,没有找到.这就是我发表这篇文章的原因。
  向ATL的DLL中传递一个C++对象参数并不是非常之难,但是,当然也会有点难度,也很有趣。
  在开始一个工程以前,首先你得确信客户机和服务器组件都是适应C++的程序,其次,你必须知道怎样设置你的客户机和服务器。
接口的局限性
  COM技术要求客户机和服务器高度的分离,这是通过接口实现的,但是问题出在:接口的方法中只提供了有限个参数数据类型,如果这个接口是基于IDispatch的,参数类型的可选范围就更加受到限制了,由于这些局限性,C++对象只有在满足以下条件时才能够传递:
客户机和服务器都是由VC++编写。 
它们必须共享对象的定义(比如 头文件)。 
传递应用程序设计的简单的对象。 
你的应用程序可能需要运行在一个分布式环境下。你希望COM的远程活动,本地/远程活动是透明的,安全的。 
我建议,在开始工作之前,先顺序的看一下各个标题,现在,我列出实例,并作以下事情:
创建一个ATL DLL服务器, 
添加一个MFC类,从CObject类派生, 
在类的头部使用 DECLARE_SERIAL 宏, 
在类的中间使用 IMPLEMENT_SERI 宏, 
覆盖Serialize() 方法, // 你的 CSimpleObj 类应该像这样:
class CSimpleObj : public CObject
{
  DECLARE_SERIAL( CSimpleObj )
public:
// 构造函数和析构函数
  CSimpleObj();
  virtual ~CSimpleObj();
// 设置内部字符串数据
  void SetString( CString csData );
// 用来向存档文件串行输入数据(序列化)
  virtual void Serialize(CArchive& ar);
// 现实字符串数据
  void Show();
private:
  CString m_strData;// 内部字符串数据
};
// 把这个数据对象写入到文档中
void CSimpleObj::Serialize(CArchive& ar)
{
  CObject::Serialize( ar );
if (ar.IsLoading())
{
// 从档案文件提取数据
  ar >> m_strData;
}
else
{
// 把数据存入档案文件
  ar << m_strData;
}
}
// 显示对象数据的方法
void CSimpleObj::Show()
{
  AfxMessageBox(m_strData);
}
//把字符串数据保存到一个变量中
void CSimpleObj::SetString(CString csData)
{
  m_strData = csData;
}      
现在,下一步就是用一个CArchive对象来进行序列化和反序列化(载入和存储对象),我用了一个叫CBlob的新类来实现的 class CBlob
{
public:
  CBlob() {};
  virtual ~CBlob() {};
// 从一个 CObject对象中提取数据并载入到一个 SAFEARRAY对象中.
  SAFEARRAY* Load( CObject *pObj );
// 重新创建一个SAFEARRAY对象
  BOOL Expand( CObject * &pObj, SAFEARRAY *pVar );
private:
};
// 从一个 CObject对象中提取数据并用它构建一个 SAFEARRAY对象.
SAFEARRAY* CBlob::Load( CObject *pObj)
{
  CMemFile memfile; // 内存文件
// 定义一个用来标记档案文件是读取还是存储的标志
  long lMode = CArchive::store | CArchive::bNoFlushOndelete;
// 用内存文件创建档案文件
  CArchive ar(&memfile, lMode );
// m_pDocument 不使用
  ar.m_pDocument = NULL;
// 序列化对象到档案文件中
  ar.WriteObject(pObj);
// 关闭档案文件--现在,数据在内存文件中
  ar.Close();
// 取得内存文件的长度(以字节为单位)
  long llen = memfile.GetLength();
// 释放缓冲区 关闭文件
  unsigned char *pMemData = memfile.Detach();
// 设定safearray
  SAFEARRAY *psa;
// 创建safearray对象存取流数据
  psa = SafeArrayCreateVector( VT_UI1, 0, llen );
// 指向字节数组的指针
  unsigned char *pData = NULL;
// 取得一个 safe array的指针. 锁定数组.
  SafeArrayAccessData( psa, (void**)&pData );
// 拷贝内存文件到 safearray
  memcpy( pData, pMemData, llen );
// 清理缓冲区
  delete pMemData;
// 锁定对 safearray的访问
  SafeArrayUnaccessData(psa);
// 返回一个在这分配的SAFEARRAY的指针
  return psa;
}
// 重新创建一个SAFEARRAY对象
BOOL CBlob::Expand(CObject * &rpObj, SAFEARRAY *psa)
{
  CMemFile memfile; // 反序列化的内存文件
  long lLength; // 字节数
  char *pBuffer; // 缓冲区指针
// 锁定数组数据的访问
  SafeArrayAccessData( psa, (void**)&pBuffer );
// 取得数组中元素个数. 是字节数
  lLength = psa->rgsabound->cElements;
// 连接缓冲区到内存文件
  memfile.Attach((unsigned char*)pBuffer, lLength);
// 从缓冲区头部开始
  memfile.SeekToBegin();
// 创建一个连接到内存文件上的档案文件
  CArchive ar(&memfile, CArchive::load | CArchive::bNoFlushOndelete);
// 不使用文档指针
  ar.m_pDocument = NULL;
// 填充对象 取得指针
  rpObj = ar.ReadObject(0);
// 关闭档案文件
  ar.Close();
// 注意: 当SAFEARRAY被毁坏时 pBuffer 被释放
// 释放缓冲区 关闭文件
  pBuffer = (char*) memfile.Detach();
// 释放safearray 缓冲区
  SafeArrayUnaccessData( psa );
  return TRUE;
}
在这里 ,我使用SAFEARRAY是因为它对我们来说是最好的选择,它可以包含一些复杂的多维数组,但是,这个例子我们只使用了非常简单的数组,SAFEARRAY数据,有一个问题:MIDL认不出这个数据类型,在下一篇文章中我将讲述最简单的方法:使用 VARIANT数据类型。
下一步如下:
创建一个COM接口, 
创建一个SAFEARRAY对象, 
在IDL文件中定义: [helpstring("method SetArray")] 
HRESULT SetArray([in]SAFEARRAY (unsigned char) pData);[helpstring("method GetArray")] 
HRESULT GetArray([out/*,retval*/]SAFEARRAY(unsigned char) *pData); 
创建一个基于MFC的客户机来测试该应用程序 你的IDL文件应该象这样: 
interface IBolbData : IUnknown
{
  [helpstring("method SetArray")] HRESULT SetArray([in]SAFEARRAY
    (unsigned char)&n

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

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

  • ATL怎么实现可变参数的接口?
  • 怎样用ATL写一个含有其它组件的进程外COM
  • ATL7中加入socket的头文件编译出错
  • 在ATL工程MFC窗口调用Create失败(注:我的ATL工程支持MFC)
  • ATL正则表达式验证遇到中文出现异常!
  • 关于ATL做复合控件的问题
  • [讨论]ATL中的文本字符串,我该定义为什么类型
  • ATL开发指南第2版为什么所有的书店都没有卖的?电子版也没有
  • 大家一般都怎么打包Atl开发的ActiveX控件?
  • 求ATL解决方案

相关文章

  • 2017-06-04 LPCTSTRlpName=vNamebstrVal?类型转换
  • 2017-06-04 关于DirectShow中Filter连接的问题
  • 2017-06-04 errorLNK2001:unresolvedexternalsymbol_main,各位看看
  • 2017-06-05 pdh在自己的dll中使用为什么会出错?
  • 2017-06-04 请教高手,怎样调试DeskBand?难道要装ie的Debug版本?
  • 2017-06-04 ATL设计COM--基础问题
  • 2017-06-04 Vc60中从EXCEL9OLB中导出的excel9cpp和excel9h用来操作EXCEL请问如果设置列宽?
  • 2017-06-05 ActiveX应用
  • 2017-06-05 我想同时拦截APIsendmessage和postmessage,可是可能有多重相应的情况,有什么好方法解决吗??
  • 2017-06-05 在我的单线程程序中用Socket连服务器,用processviewer(spy++)看,有两个线程,为什么?

文章分类

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

最近更新的内容

    • 怎么在VC的ActiveX控件中添加Flash控件?
    • 如何获取内存里某一进程的某一对象指针??
    • FutureStudio(未来工作室)
    • 这个问题,一个星期没搞定。求高手。
    • 请问接口如何传递数组
    • 救我大虾们:如何阻止使用线程时,内存大量被占用?
    • 我想使用OWC,但是不希望安装office2000,可否自己注册owc组件?
    • 添加CDataSource
    • 请问:在主线程中调用acceptsock后,能否启动一新线程,在该线程中处理sock的FD_READ/FD_WRITE等消息
    • BHO程序很脆弱吗?

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

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