描述:
比如客户端要传入一个结构体.
struct CPingReply
{
in_addr Address; //The IP address of the replier
};
ATL 提供的接口函数:
Get(CPingReply &m_PingReply)
由ATL 填充引用结构体的数据。
这样做可行吗?
解决方案1:
要转换,com里面没有办法引出结构体,如果结构体过于复杂的话,可以考虑将结构体做成一个新的接口,数据封装在coclass里面,通过接口获得设置数据,如果结构体不是很复杂,可以考虑variant
Mystuct m_struct[10]; //Mystuct 自定义结构
for(int i=0;i<10;i++)
{
m_struct[i].x=(float)i;
m_struct[i].y=(float)i;
m_struct[i].z=(float)i;
m_struct[i].w='x';
}
HRESULT hr;
//create an array bound
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0; //The first (and only) collumn of our array starts at 0.
rgsabound[0].cElements = 10; //and has 100 elements.
//create the array
SAFEARRAY FAR* pMySafeArray;
pMySafeArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
Mystuct *pData;
hr = SafeArrayAccessData( pMySafeArray, reinterpret_cast<PVOID*>(&pData)); //Get a pointer to the data.
//copy the bytes of data from our old array to the new one.
memcpy(pData, m_struct, 10*sizeof(Mystuct));
for(int i = 0; i < 10; i++) ASSERT(pData[i].x == m_struct[i].x);
SafeArrayUnaccessData(pMySafeArray);
//To put the SafeArray in a Variant
VARIANT myVariant;
myVariant.parray = pMySafeArray;
myVariant.vt = VT_ARRAY;
SafeArrayUnaccessData(myVariant.parray); //然后把myVariant传出去就可以了