怎样把接口返回的_variant_t结果转换成自己的类对象?

jockcivil 2003-11-24 12:57:34
我调用一个com接口,接口定义返回的是_variant_t类型,但是我把它转换成一个自己定义的类,而且这个类还是一个抽象类,我对_variant_t不属性,不知道如何转换,请教各位高手.
...全文
87 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jockcivil 2003-12-03
  • 打赏
  • 举报
回复
我这里很急啊,高手救救我啊!
jockcivil 2003-11-28
  • 打赏
  • 举报
回复
这个com在vb中可以如下实现:
Dim objAPI As RTXServerApi.RTXAPI
Dim objSMS As RTXServerApi.IRTXObject
Dim objProp As Object
Dim RetCode As Integer
'创建RTX API的主对象
Set objAPI = CreateObject("RTXServer.RTXAPI")
Set objSMS = objAPI.GetObject("SMSObject")
Set objProp = objAPI.GetObject("Property")
但是因为IRTXObject是抽象类,而且CreateObject()定义返回_variant_t,我就是不知道在vc中如何实现,接口说明见上面。
jockcivil 2003-11-27
  • 打赏
  • 举报
回复
以下是那个要转换的抽象类也是从com中来:
struct __declspec(uuid("73a1052c-4f24-498d-9490-9ba58e1a82e4"))
IRTXObject : IDispatch
{
// Property data
__declspec(property(get=GetName))
_variant_t Name;
// Wrapper methods for error-handling
_variant_t GetName ( );
_variant_t Call (
long lID,
const _variant_t & vProperty );
// Raw methods provided by interface
virtual HRESULT __stdcall get_Name (
VARIANT * pName ) = 0;
virtual HRESULT __stdcall raw_Call (
long lID,
VARIANT vProperty,
VARIANT * pResult ) = 0;
};
我就是要调用下面这个com的GetObject()的接口,把返回转换成上面的抽象类:
struct __declspec(uuid("3379d525-31f2-4705-ab46-2e9478dc6a2b"))
IRTXSvrAPI : IDispatch
{
// Wrapper methods for error-handling
_variant_t GetObject (
const _variant_t & vObjectID );
_variant_t Call (
long lIndex,
const _variant_t & vProperty );
// Raw methods provided by interface
virtual HRESULT __stdcall raw_GetObject (
VARIANT vObjectID,
VARIANT * ppObject ) = 0;
virtual HRESULT __stdcall raw_Call (
long lIndex,
VARIANT vProperty,
VARIANT * pResult ) = 0;
};
wangweixing2000 2003-11-27
  • 打赏
  • 举报
回复
如果你要传类理论上是不可行的,如果你只是想把类中的得数据传出去也很好办
写一个struct就好了,因为com可以传struct,还有一种办法就是把你的类封装成IUnkown接口在传就可以了。
justleon 2003-11-26
  • 打赏
  • 举报
回复
重载等号操作符
class myclass{
public:
myclass operator=(_variant_t *op){
把op中的值取出来,赋给你的类的相关成员变量
}
flyingjust 2003-11-26
  • 打赏
  • 举报
回复
同一进程中使用com组件就像使用dll一样 可以直接把 类的指针传过去 如在进程间使用就必须把对象打包成IDL支持的数据类型 网上有很资料
justleon 2003-11-25
  • 打赏
  • 举报
回复
把你的类贴出来
jockcivil 2003-11-25
  • 打赏
  • 举报
回复
问题是我要把返回结果转换成一个抽象类型,我是不是可以先设一个抽象类的指针变量,然后把com接口返回的_variant_t类型转换成抽象类的指针,这个com接口其实就是返回这个抽象类的对象,但是如何把这个_variant_t结果转换成抽象类的指针了?
Promise91 2003-11-25
  • 打赏
  • 举报
回复
_variant_t中有VARIANT类型 若内含BSTR类的可以直接进行赋值给另一个BSTR
若环境是VC也可以直接赋给CSTRING,其它的也一样啊
whereisthedog 2003-11-25
  • 打赏
  • 举报
回复
//i assumed your variant just store on class
class myclass;
myclass *mc;
mc=new myclass();
void *p
p=memalloc(length);
(_variant_t *)p=myvariant;
mc=p;
isonme 2003-11-24
  • 打赏
  • 举报
回复
试试先把值赋给另一个对象,然后在对那个对象操作
mickeyfirst 2003-11-24
  • 打赏
  • 举报
回复
_variant_t封装了VARIANT类型,提供了一些非常有用的处理BSTR变量的操作符或方法。
xiaohyy 2003-11-24
  • 打赏
  • 举报
回复
楼主思路有问题。。
joachern 2003-11-24
  • 打赏
  • 举报
回复
COleVariant

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧