描述:
在VB端调用此接口,得到的数据全都是0,望指点。
STDMETHODIMP CEDBT::EncryptArray(long RecordID, VARIANT InArray, /* [out]*/ VARIANT FAR* OutArray, long InBufLen, /*[out, retval]*/ long *iReturn)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
LPBYTE pInArray,pOutArray;
HRESULT hr;
VARIANT var;
CComVariant v;
SAFEARRAYBOUND rgsabound[1];
SAFEARRAY FAR* psa = NULL;
long iRet,i;
.................
.................
//之前处理输入数组InArray,iReturn为返回数据的长度,输出数据指针为outputBuffer,希望数据作为数组返回应用程序。
//到次一步为止,程序运行正确
pOutArray = outputBuffer;
if(iReturn <= 0)
{
delete pInArray;
delete pOutArray;
return S_OK;
}
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = *iReturn;
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
if(psa == NULL)
{
return E_OUTOFMEMORY;
}
for(i=0;i<*iReturn;i++)
{
v = pOutArray[i];
VariantInit(&var);
var.vt=VT_I4;
v.Detach(&var);
SafeArrayPutElement(psa, &i, &var);
VariantClear(&var);
}
OutArray->vt = VT_ARRAY|VT_VARIANT;
OutArray->parray = psa;
delete pInArray;
// TODO: Add your implementation code here
return S_OK;
}
解决方案1:
typedef struct FARSTRUCT tagSAFEARRAY {
unsigned short cDims; // Count of dimensions in this array.
unsigned short fFeatures; // Flags used by the SafeArray
// routines documented below.
#if defined(WIN32)
unsigned long cbElements; // Size of an element of the array.
// Does not include size of
// pointed-to data.
unsigned long cLocks; // Number of times the array has been
// locked without corresponding unlock.
#else
unsigned short cbElements;
unsigned short cLocks;
unsigned long handle; // Used on Macintosh only.
#endif
void HUGEP* pvData; // Pointer to the data.
SAFEARRAYBOUND rgsabound[1]; // One bound for each dimension.
} SAFEARRAY;
------------------------------------------------
直接赋给psa->pvData
你先跟踪调试一下,看看函数里面的值是否为零。用VC调用试试,看是否也为零
解决方案3: 原因不在com,而在于,你的局部变量在这个函数内肯定是正确的。
但是,一旦出了这个范围,变量就自动释放了,你当然什么也得不到了