如何完成任意结构在COM对象间传递
-------------------------------
假设有结构
struct TS
{
....
};
TS ts;
步骤:
1.将结构转化为Variant变量
ts----->variant
int Size=sizeof(TS);
void *p=(void *)(&ts);//将ts强制转化为void指针
Variant a;
a=VarArrayCreate(OPENARRAY(char,(0,Size-1));//
char *ax = (char *) a.ArrayLock();
for(int i=0;i<Size;i++)
ax[i]=p[i];
a.ArrayUnlock();
2.将Variant变量转化为结构
Variant------->TS
int Size=Sizeof(TS)
char *ax=(char *)a.ArrayLock();
for(int i=0;i<Size;i++)
p[i]=ax[i];
ts=(TS *)p;
OK;
因此可以抽象出如下两个方法:
1、
void Struct2Variant(Variant *var,char *p,int Size)
{
file://Struct to Variant
*var=VarArrayCreate(OPENARRAY(char,(0,Size-1));
char *ax = (char *) var->ArrayLock();
for(int i=0;i<Size;i++)
ax[i]=p[i];
var->ArrayUnlock();
}
2、
void Variant2Struat(Variant *var,char *p,int Size)
{
file://Variant to Struct
char *ax = (char *) var->ArrayLock();
for(int i=0;i<Size;i++)
p[i]=ax[i];
var->ArrayUnlock();
}
以上两函数的用法示例
TMyStruct MyStruct;
Variant va;
Struct2Variant(&va,(char *)MyStruct,SizeOf(MyStruct));
SendToSvr(va);
在另外的Com中
STDMETHODIMP TadasdaImpl::SendToSvr(TVariantInParam va)
{
TMyStruct MyStruct;
Variant var=va;
Variant2Struat(&var,(char *)MyStruct,SizeOf(MyStruct));
现在MyStruct和客户端内容是一样的
}
注意,使用这种方法传递结构,结构内如有指针变量,则指针变量所
致内容无法传递,同时,如有字符串,不要使用AnsiString定义,使用
char MyStr[n]定义
第一次发表文章,可能读来拗口,您就迁就点吧