Determine if an Outlook item has been modified but not saved (Outlook Auxiliary Reference)

This topic shows how to use the dispidFDirty dispatch ID to invoke the corresponding property on an Outlook item, to see whether the item has been modified and has not been saved.

Given an item object, you can use the IUnknown::QueryInterface method to obtain an IDispatch interface pointer. The function in the topic FIsItemDirty accepts an IDispatch pointer, pdisp, as an input parameter. FIsItemDirty calls the IDispatch::Invoke method, specifying dispidFDirty as the argument for the dispIdMember parameter, and the flags DISPATCH_METHOD | DISPATCH_PROPERTYGET for wFlags, to verify whether the item has been modified. FIsItemDirty returns a Boolean value (True to indicate that the item has unsaved changes; otherwise, False).

bool FIsItemDirty(IDispatch *pdisp)
{
    DISPPARAMS dispparams;
    UINT uArgErr;
    HRESULT hr = S_OK;
    CComVariant varDirty;
    dispparams.rgvarg = 0;
    dispparams.cArgs = 0;
    dispparams.cNamedArgs = 0;
    dispparams.rgdispidNamedArgs = NULL;
    hr = pdisp->Invoke(dispidFDirty,
        IID_NULL,
        LOCALE_SYSTEM_DEFAULT,
        DISPATCH_METHOD | DISPATCH_PROPERTYGET,
        &dispparams,
        &varDirty,
        NULL,
        &uArgErr);
    return SUCCEEDED(hr) && varDirty.bVal;
}

See also