VARIANT通用方法

//获取字符串型数组

BOOL GetCstringArray(const VARIANT FAR& pstrinput, CString *const strinput,short count)
{

#ifdef _MY_TEST_
MessageBox("进入字符串数据获取");
#endif
if (pstrinput.vt ==(VT_ARRAY|VT_BSTR))
{
long dim=SafeArrayGetDim(pstrinput.parray);
long ubound,lbound;
SAFEARRAY *psa;
psa=pstrinput.parray;
SafeArrayGetUBound(psa,dim,&ubound);
SafeArrayGetLBound(psa,dim,&lbound);

BSTR * buf;
SafeArrayAccessData(psa,(void **)&buf);
for (int i=lbound;i<=ubound;i++)
{
if (i>=count)
{
return FALSE;
}
if (buf[i]==NULL)
{
strinput[i]="";
}
else
{
strinput[i]=buf[i];
}
}
SafeArrayUnaccessData(psa);
return TRUE;
}
else if (pstrinput.vt ==(VT_DISPATCH))
{
int strindex=0;

WCHAR output[4096] = L"";
IDispatchPtr spDisp = pstrinput.pdispVal;
DISPID dispID = 0;
DISPPARAMS dispParams = {NULL, NULL, 0, 0};
CComVariant result;
UINT nArgErr = (UINT)-1; // initialize to invalid arg
unsigned int length = 0; // 数组长度 或 属性 个数

EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);

//读取数组长度
LPOLESTR func = L"length";
HRESULT hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
if(S_OK == hr){ // 如果有"length"属性
hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
if(S_OK == hr && VT_I4 == result.vt)
length = result.intVal; // 直接读取数组长度
}
else
{
unsigned int nTypeInfo = 0;
hr = spDisp->GetTypeInfoCount(&nTypeInfo);
ATLASSERT(1 == nTypeInfo);
ITypeInfoPtr spTypeInfo;
hr = spDisp->GetTypeInfo(0, 0, &spTypeInfo);
TYPEATTR *pTypeAttr = NULL;
hr = spTypeInfo->GetTypeAttr(&pTypeAttr);
//ATLASSERT("{C59C6B12-F6C1-11CF-8835-00A0C911E8B2}" == pTypeAttr->guid); // JScript:
length = pTypeAttr->cVars; // 从类型信息读取数组长度
spTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"字符串数组长度:%d\n",length);
MessageBox(temptestOut);
#endif
for(unsigned int i=0; i<length; i++)
{
WCHAR buf[32];
_itow(i, buf, 10);
func = buf;
hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
if(S_OK != hr)
continue;

if(VT_DISPATCH == result.vt)
{
IDispatchPtr spItem = result.pdispVal;
func = L"name";

hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);

if(S_OK == hr && VT_BSTR == result.vt)
{
// CHAR output[1024];
// swprintf(output + wcslen(output), L"name=%s", result.bstrVal);
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"5收到一个BSTR数据,其值为:%s\n",result.bstrVal);
MessageBox(temptestOut);
#endif
strinput[strindex]=result.bstrVal;
strindex++;
}

func = L"age";
hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);

if(S_OK == hr && VT_I4 == result.vt)
{
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"4收到一个I4数据,其值为:%d",result.intVal);
MessageBox(temptestOut);
#endif
//swprintf(output + wcslen(output), L" age=%d\n", result.intVal);
}
}
else if(VT_BSTR == result.vt)//字符串读取
{
strinput[strindex]=result.bstrVal;
strindex++;
#ifdef _MY_TEST_

CString testex;
testex="3收到一个BSTR数据,其值为:";
testex +=result.bstrVal;
MessageBox(strinput[strindex-1]);
#endif
//swprintf(output + wcslen(output), L"BSTR:%s\n", result.bstrVal);
}
else if(VT_I4 == result.vt)//数字的读取
{
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"2收到一个I4数据,其值为:%d",result.intVal);
MessageBox(temptestOut);
#endif
//swprintf(output + wcslen(output), L"I4:%d\n", result.intVal);
}
else
{
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"1收到一个未知类型数据,其类型为:%d",result.vt);
MessageBox(temptestOut);
#endif
//swprintf(output + wcslen(output), L"item.vt=%d\n", result.vt);
}
}

return TRUE;
}
return FALSE;
}

 

//获取数值型数组
BOOL GetLongArray(const VARIANT FAR& plcasebh,long * const lcasebh,short count)
{
#ifdef _MY_TEST_
char testex[1024];
sprintf(testex,"进入数字数据获取:%d",plcasebh.vt);
MessageBox(testex);
#endif
if (plcasebh.vt==(VT_ARRAY|VT_I4))
{
long dim=SafeArrayGetDim(plcasebh.parray);
long ubound,lbound;
SAFEARRAY *psa;
psa=plcasebh.parray;
SafeArrayGetUBound(psa,dim,&ubound);
SafeArrayGetLBound(psa,dim,&lbound);

long * buf;
SafeArrayAccessData(psa,(void **)&buf);
for (int i=lbound;i<=ubound;i++)
{
if (i>=count)
{
return FALSE;
}
lcasebh[i]=buf[i];
}
SafeArrayUnaccessData(psa);
return TRUE;
}
else if (plcasebh.vt ==VT_DISPATCH)
{

int strindex=0;

WCHAR output[4096] = L"";
IDispatchPtr spDisp = plcasebh.pdispVal;
DISPID dispID = 0;
DISPPARAMS dispParams = {NULL, NULL, 0, 0};
CComVariant result;
UINT nArgErr = (UINT)-1; // initialize to invalid arg
unsigned int length = 0; // 数组长度 或 属性 个数

EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);

//读取数组长度
LPOLESTR func = L"length";
HRESULT hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
if(S_OK == hr)
{ // 如果有"length"属性
hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
if(S_OK == hr && VT_I4 == result.vt)
length = result.intVal; // 直接读取数组长度
}
else
{
unsigned int nTypeInfo = 0;
hr = spDisp->GetTypeInfoCount(&nTypeInfo);
ATLASSERT(1 == nTypeInfo);
ITypeInfoPtr spTypeInfo;
hr = spDisp->GetTypeInfo(0, 0, &spTypeInfo);
TYPEATTR *pTypeAttr = NULL;
hr = spTypeInfo->GetTypeAttr(&pTypeAttr);
//ATLASSERT("{C59C6B12-F6C1-11CF-8835-00A0C911E8B2}" == pTypeAttr->guid); // JScript:
length = pTypeAttr->cVars; // 从类型信息读取数组长度
spTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"字符串获取中,数组维数:%d",length);
MessageBox(temptestOut);
#endif
for(unsigned int i=0; i<length; i++)
{
WCHAR buf[32];
_itow(i, buf, 10);
func = buf;
hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
if(S_OK != hr)
continue;

if(VT_DISPATCH == result.vt)
{
IDispatchPtr spItem = result.pdispVal;
func = L"name";

hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);

if(S_OK == hr && VT_BSTR == result.vt)
{
//swprintf(output + wcslen(output), L"name=%s", result.bstrVal);
//strinput[strindex]=result.bstrVal;
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"收到一个未知数据类型:%d",result.vt);
MessageBox(temptestOut);
#endif
}

func = L"age";
hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);

if(S_OK == hr && VT_I4 == result.vt)
{
//swprintf(output + wcslen(output), L" age=%d\n", result.intVal);
lcasebh[strindex]=result.intVal;
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"收到一个数据:%d",result.intVal);
MessageBox(temptestOut);
#endif
strindex++;
}
}
else if(VT_BSTR == result.vt)//字符串读取
{
//strinput[strindex]=result.bstrVal;
//swprintf(output + wcslen(output), L"BSTR:%s\n", result.bstrVal);
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"收到一个数据:%s",result.bstrVal);
MessageBox(temptestOut);
#endif
}
else if(VT_I4 == result.vt)//数字的读取
{
lcasebh[strindex]=result.intVal;
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"收到一个数据:%d",result.intVal);
MessageBox(temptestOut);
#endif
strindex++;
//swprintf(output + wcslen(output), L"I4:%d\n", result.intVal);
}
else
{
#ifdef _MY_TEST_
char temptestOut[1024];
sprintf(temptestOut,"收到一个未知数据类型:%d",result.vt);
MessageBox(temptestOut);
#endif
//swprintf(output + wcslen(output), L"item.vt=%d\n", result.vt);
}
}
return TRUE;
}
return FALSE;
}

posted @ 2012-06-14 22:14  qqnihao  阅读(478)  评论(0)    收藏  举报