안되는 줄 알았는데, 이전 직장에 함께근무했던 선배한테 물어보니 된다는 군요...^^
(혼자 도배하는 기분이네요)
[
    uuid(AAA60663-440E-446E-99AF-2A0DEEB389C4),
    helpstring("_IWebTreeEvents Interface")
]
dispinterface _IWebTreeEvents
{
properties:
methods:
    [id(1), helpstring("method BeforeMove")] HRESULT BeforeMove([in, 
out]VARIANT_BOOL *Cancel);
};
 
 
HRESULT
 Fire_BeforeMove(
VARIANT_BOOL 
* 
Cancel)
{
    CComVariant
varResult;
    T* pT 
= static_cast<T*>(this);
    int 
nConnectionIndex;
    CComVariant*
pvars = new
CComVariant[1];
    int 
nConnections = m_vec.GetSize();
    for (nConnectionIndex 
= 0; nConnectionIndex 
< nConnections; 
nConnectionIndex++)
    {
        
pT->Lock();
        CComPtr<IUnknown>
sp = m_vec.GetAt(nConnectionIndex);
        
pT->Unlock();
        
IDispatch* pDispatch = 
reinterpret_cast<IDispatch*>(sp.p);
        if (pDispatch 
!= NULL)
        {
           
VariantClear(&varResult);
           
pvars[0].vt 
= VT_VARIANT | VT_BYREF;
            
VARIANT 
varCancel;
           
varCancel.vt 
= VT_BOOL;
           
varCancel.boolVal 
= *Cancel;
           
pvars[0].pvarVal 
= &varCancel;
            
DISPPARAMS disp = { 
pvars, NULL, 1,
0 };
           
pDispatch->Invoke(0x1,
IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, &disp, 
&varResult, NULL,
NULL);
            
if (varCancel.vt 
& VT_BOOL)
               
*Cancel 
= varCancel.boolVal;
            
else
               
*Cancel 
= 
VARIANT_FALSE;
        }
    }
    delete[]
pvars;
    return 
varResult.scode;
}