static void HspVarComobj_Free( PVal *pval ) { // PVALポインタの変数メモリを解放する // IUnknown** ppunk; if ( pval->master ) { FreeDispParams( (ComDispParams *)pval->master ); } if ( pval->mode == HSPVAR_MODE_MALLOC ) { // (一時変数に含まれるオブジェクトは Release しない) if ( (pval->support & HSPVAR_SUPPORT_TEMPVAR) == 0 ) { #ifdef HSP_COMOBJ_DEBUG COM_DBG_MSG( "HspVarComobj_Free()\n" ); #endif int count = HspVarCoreCountElems( pval ); ppunk = (IUnknown **)pval->pt; for (int i=0; i<count; i++) { ReleaseComPtr( &ppunk[i] ); } } sbFree( pval->pt ); } pval->pt = NULL; pval->flag = HSPVAR_MODE_NONE; }
static void HspVarComobj_Alloc( PVal *pval, const PVal *pval2 ) { // pval変数が必要とするサイズを確保する。 // (pvalがすでに確保されているメモリ解放は呼び出し側が行なう) // (pval2がNULLの場合は、新規データ) // (pval2が指定されている場合は、pval2の内容を継承して再確保) // int count,size; IUnknown **ppunk; #ifdef HSP_COMOBJ_DEBUG COM_DBG_MSG( "HspVarComobj_Alloc()\n" ); #endif if ( pval->len[1] < 1 ) pval->len[1] = 1; // 配列を最低 1 は確保する count = HspVarCoreCountElems(pval); size = count * sizeof( IUnknown* ); ppunk = (IUnknown **)sbAlloc( size ); pval->mode = HSPVAR_MODE_MALLOC; for (int i=0; i<count; i++) { ppunk[i] = NULL; } if ( pval2 != NULL ) { memcpy( ppunk, pval->pt, pval->size ); sbFree( pval->pt ); if ( pval->master ) sbFree( pval->master ); } pval->master = NULL; // ComDispParams 用 pval->pt = (char *)ppunk; pval->size = size; }
static int GetVarSize( PVal *pval ) { // PVALポインタの変数が必要とするサイズを取得する // (sizeフィールドに設定される) // return HspVarCoreCountElems(pval) * sizeof(int); }