如何调用COM库中的一个函数,参数为_variant_t类型?

ToperRay 2011-08-24 02:41:35
我调用一个COM库中的一个函数,其中的一个函数 XXXX::Relink(const _variant_t & to),

问,我如何能判断参数to的类型?

...全文
438 点赞 收藏 42
写回复
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbs_biscuit 2011-10-21
如果他支持 idispatch ,有支持 provideclassinfo2, 能不能通过 provideclassinfo2 接口看一下这个参数究竟是个什么东西?
回复
saiyaman5 2011-08-26
调用前,你必须先知道这个参数本来的基本类型是什么,这个和你的业务逻辑有关.只从自己的方面去判断是不行的,这个又不是输出参数
回复
ToperRay 2011-08-26
你没看懂我的问题啊。。。。

[Quote=引用 32 楼 lezhong2 的回复:]

cstring 类型应该可以强制转换
(_variant_t)str
[/Quote]
回复
saiyaman5 2011-08-26
[Quote=引用 38 楼 toperray 的回复:]
不要说什么不可能,
即使是不可能也会有个相比较而言更优的方法来猜。


引用 37 楼 saiyaman5 的回复:

引用 35 楼 toperray 的回复:

有什么办法能猜出来吗?

引用 34 楼 saiyaman5 的回复:

调用前,你必须先知道这个参数本来的基本类型是什么,这个和你的业务逻辑有关.只从自己的方面去判断是不行的,这个又不是输出参数


这……
[/Quote]

如果是开发应用时偶遇这样的问题,我觉得不用花太多心思在这方面上,无多大意义
如果你是专门研究这方面的课题,就另当别论.
回复
ndy_w 2011-08-26
如果能从提供者拿到说明才是最优的...逆向是没办法才用的。
回复
ToperRay 2011-08-26
最优方案吗?

[Quote=引用 36 楼 ndy_w 的回复:]

用soft-ice之类跟踪,设定VT地址的读中断,跟踪进去,看看VT是啥。如果是unknonw或dispatch,看看汇编代码里后续有没有push2个参数的call,看看iid是啥...
简直是做逆向
[/Quote]
回复
ToperRay 2011-08-26

不要说什么不可能,
即使是不可能也会有个相比较而言更优的方法来猜。


[Quote=引用 37 楼 saiyaman5 的回复:]

引用 35 楼 toperray 的回复:

有什么办法能猜出来吗?

引用 34 楼 saiyaman5 的回复:

调用前,你必须先知道这个参数本来的基本类型是什么,这个和你的业务逻辑有关.只从自己的方面去判断是不行的,这个又不是输出参数


这是不可能的,比如我写个函数参数也用这个,你怎么会知道我函数内怎么用?
我是用作int 还是用作字符串,你怎么去猜.
等你调用时……
[/Quote]
回复
saiyaman5 2011-08-26
[Quote=引用 35 楼 toperray 的回复:]

有什么办法能猜出来吗?

引用 34 楼 saiyaman5 的回复:

调用前,你必须先知道这个参数本来的基本类型是什么,这个和你的业务逻辑有关.只从自己的方面去判断是不行的,这个又不是输出参数
[/Quote]

这是不可能的,比如我写个函数参数也用这个,你怎么会知道我函数内怎么用?
我是用作int 还是用作字符串,你怎么去猜.
等你调用时我会告诉你,这应该赋一个int 而不是字符串,你直接把int作参数就好了.


回复
ndy_w 2011-08-26
用soft-ice之类跟踪,设定VT地址的读中断,跟踪进去,看看VT是啥。如果是unknonw或dispatch,看看汇编代码里后续有没有push2个参数的call,看看iid是啥...
简直是做逆向
回复
ToperRay 2011-08-26
有什么办法能猜出来吗?

[Quote=引用 34 楼 saiyaman5 的回复:]

调用前,你必须先知道这个参数本来的基本类型是什么,这个和你的业务逻辑有关.只从自己的方面去判断是不行的,这个又不是输出参数
[/Quote]
回复
火狐狸 2011-08-25
其实我是蹭分的....
回复
火狐狸 2011-08-25
_variant_t   CVariantDlg::vartest(int   i,   int   &   nValue)//0   float,1   double,2   WCHAR 
{
_variant_t rvalue;
switch (i)
{
case 1:
//¾ÙÀý
rvalue.vt = VT_R4;
rvalue.dblVal = (float)199;

break;
case 2:
rvalue.vt = VT_R8;
rvalue.dblVal = (double)3.1415926;

break;
case 3:
rvalue=(WCHAR *)L "test var ";
break;
}
return rvalue;
}
回复
ToperRay 2011-08-25

这个基本确认不行。

[Quote=引用 26 楼 gold_water 的回复:]

可以的话,传HANDLE---文件句柄;
[/Quote]
回复
gold_water 2011-08-25
可以的话,传HANDLE---文件句柄;
回复
ToperRay 2011-08-25
难道没解???

[Quote=引用 24 楼 ndy_w 的回复:]

正是。VT_UNKNOWN也不能确定。
这个属于语义,如果提供了接口而没有语义,是比较难搞。
[/Quote]
回复
ndy_w 2011-08-25
正是。VT_UNKNOWN也不能确定。
这个属于语义,如果提供了接口而没有语义,是比较难搞。
回复
ToperRay 2011-08-25
这个办法不可行,因为VARIANT很有可能是VT_DISPATCH,
光有VT_DISPATCH你还是搞不定如何传参。

[Quote=引用 21 楼 ndy_w 的回复:]

土办法:用不同的VT去调用,排除掉返回参数类型错的...
不过好像也不行啊!
给你个函数声明 const char* get_string_for_int(int a);你也要知道a可能的范围啊
[/Quote]
回复
ToperRay 2011-08-25
这个我知道。我是要传参,是要构造这个参数啊。


[Quote=引用 20 楼 healer_kx 的回复:]

不知道是不是我没有理解lz的需求。

我一般用CCom***类,比较简单。

C/C++ code

class CComVariant : public tagVARIANT
{
// Constructors
public:
CComVariant() throw()
{
::VariantInit(this);
}
~CComVar……
[/Quote]
回复
ndy_w 2011-08-25
土办法:用不同的VT去调用,排除掉返回参数类型错的...
不过好像也不行啊!
给你个函数声明 const char* get_string_for_int(int a);你也要知道a可能的范围啊
回复
healer_kx 2011-08-25
不知道是不是我没有理解lz的需求。

我一般用CCom***类,比较简单。


class CComVariant : public tagVARIANT
{
// Constructors
public:
CComVariant() throw()
{
::VariantInit(this);
}
~CComVariant() throw()
{
Clear();
}

CComVariant(_In_ const VARIANT& varSrc)
{
vt = VT_EMPTY;
InternalCopy(&varSrc);
}

CComVariant(_In_ const CComVariant& varSrc)
{
vt = VT_EMPTY;
InternalCopy(&varSrc);
}
CComVariant(_In_ LPCOLESTR lpszSrc)
{
vt = VT_EMPTY;
*this = lpszSrc;
}


你看它的若干构造函数,那个vt成员,我们怎么能不知道type呢?
回复
发动态
发帖子
ATL
创建于2007-09-28

3206

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
社区公告
暂无公告