• 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 error无效指针,对象指针调用构造函数,com函数,com库函数,com对象等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: COM 类函数怎么返回自定义对象指针?
描述:

我重建了一个 MFC Regular DLL with Automation 的项目,使用 classwizard 新建一个 class 的时候,发现不能把返回值定义为自己想要的类型。请教各位大侠!
我期望的 class 为 
class MyLogger{
public:
    static MyLogger& getLogger(LPCTSTR value);
    void log(LPCTSTR value);
}
请教怎么写 getLogger 的返回值? 另外,如果返回对象指针,怎么销毁?


解决方案1:

mm

解决方案2:

mark

解决方案3:

BYTE** pbClass

解决方案4:

http://blog.csdn.net/newkey007/archive/2004/07/09/38139.aspx

解决方案5:

这样运行性能比较低一些。

解决方案6:

VB的那些对象不是变体就是自动化的。在VC中的对应类型是VARIANNT/IDispatch*
VB是快速开发的一个很好的工具。它自动替你实现了组件创建、接口查询、引用计数和组件的生命期问题。通常你要做的只是实现接口。同时如果你添加了一个到组件类型库的引用,那么你可以在自动完成功能中看到它会自动提示接口的成员。VB的优点在于快速开发,缺点是降低了灵活度,以及混淆了接口及其实现。区分接口及其实现是COM的核心之一。

解决方案7:

4.对于想把一个ASP对象作为参数的方法(如Request对象),可以使用[in]Iunkown *pIUnk
,在函
数体内,可用如下语句:(具体请查阅MSDN中的相关类的内容) 
IRequest* pIRequest; 
HRESULT hr = pIUnk->QueryInterface(IID_IRequest, reinterpret_cast<LPVOID*>(&pIRe
quest)); 
Long m_lDataSize; 
HRESULT hr = pIRequest->get_TotalBytes(&m_lDataSize); 
if (FAILED(hr)) 
return hr; 
if (m_lDataSize == 0L) 
{ 
return S_OK; 
} 
COleVariant varBytesToRead; 
COleSafeArray sarrayBytes; 
varBytesToRead = m_lDataSize; 
sarrayBytes.CreateOneDim(VT_UI1, m_lDataSize); 
hr = pIRequest->BinaryRead(&varBytesToRead, &sarrayBytes); 
if (FAILED(hr)) 
{ 
sarrayBytes.Clear(); 
return hr; 
} 
… 
5.对于不定个数参数,可使用SAFEARRAY,但使用方法较为复杂。可以在参数中输入如下的内
容[in]SAFEARRAY array,并按Attribute…按钮,在Name中选择vararg。按确定后修改idl文
件在把[in]SAFEARRAY array改为[in]SAFEARRAY(VARIANT) array。然后再打开MyComponent.
h文件把该函数的参数SAFEARRAY array改为SAFEARRAY* array。再打开MyComponent.cpp文件
修改参数,在函数体内
使用COleSafeArray类实现该参数的控制,如“COleSafeArray SArray(array,VT_BSTR)”,
具体操作可查阅MSDN中的该类的成员函数。

解决方案8:

1.对于传入的参数必须在参数前加上[in],然后可跟上如int n或float f等。且每个传入参
数前都必
须写明。 
2.对于调用方法的返回,不再是该方法名前的类型(因为所有这些方法都返回HRESULT,即表
明是否调用成功),所以使用传出的参数,在参数前必须加上[out,retval],然后可跟上如in
t* n 或者float* f等(如果返回的是int 或float 类型值时)。且每个方法仅限于返回一个
这样的参数。在函数体中可如写上如“*Number2=Number1;”,表示把输入参数作为传出参数
。 
3.对于最常用的字符串参数在此我们使用BSTR str而不是通常的char* 或CString,所以在参
数中需
要写作[in]BSTR str 或[out,retval]BSTR* str。需要特别注意与CString的转换。如新建一
个函
数StrConv([in]BSTR bstr1,[out,retval]BSTR* bstr2),在函数体中可写上如: 
CString str; 
str=bstr1; 
str=str.Left(str.GetLength()-1); 
*bstr2=str.AllocSysString();

解决方案9:

这种问题已经问过很多次了,只能在接口中方法中返回接口指针,eg:
HRESULT GetIXXX([out,retval]IDISATCH** PIXXX);
你要返回类对象指针那时不可能的!哈哈!


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

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

  • com和客户之间是否可以传输函数指针?
  • COM中关于对象指针的传递
  • 关于COM中的指针问题
  • 在COM编程中,关于_com_error和ErrorsPtr的区别,急啊,救命啊
  • COM中指针的传递
  • com中使用主框架指针的问题
  • com中指针定义
  • 怎么等到已经创建的com服务实例的指针
  • 《COM技术内幕》指针类型转换
  • 关于COM智能指针的问题

相关文章

  • 2017-06-04 VS2005不能开发shell扩展程序吗?
  • 2017-06-04 truedbgridpro70问题
  • 2017-06-04 求助:我的BHO问题在哪里?
  • 2017-06-04 峨嵋的猴大哥(EMeiMonkey),请教一个问题!!!
  • 2017-06-04 用OCX封装了一个录制和播放WAVE的程序,无法正常工作
  • 2017-06-05 int类型在activex控件对外的接口中是什么类型
  • 2017-06-04 如何设计好接口返回值
  • 2017-06-05 Windows下多线程读写一个数据库,需要注意那些问题?
  • 2017-06-05 如何让自定义类能截取发往对话框的消息
  • 2017-06-05 建立新IE进程,如何使IE脱机?

文章分类

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

最近更新的内容

    • 如何在控件中显示控件自己的属性页?高手帮忙啊~~急~急~急
    • 用VB调试在ASP中使用的COM组件???
    • 如何用VC屏蔽IE中的返回键"Alt+<--",急,谢谢!
    • 多少位的问题!!!!
    • mschart控件调用函数SetColumnLabel出错
    • COM中使用ADO的问题
    • 关于用loadrunner,做activex的压力测试
    • 如何手动实施VC编译后自动执行的注册工作?如解决另有高分相送
    • 请教一个难题,VC高手都过来看看---如何取另一个程序窗口里ListBox或者TreeView里的文字?
    • COM基本问

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

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