What does HRESULT 0x8002000D (DISP_E_ARRAYISLOCKED) mean?

 
Previous Next
DISP_E_UNKNOWNLCID DISP_E_BADPARAMCOUNT

DISP_E_ARRAYISLOCKED

Automation SAFEARRAY is locked

DISP_E_ARRAYISLOCKED is HRESULT 2147614733 (0x8002000D) from winerror.h. The documented description is “Memory is locked.” The value must be interpreted at SAFEARRAY mutation, redimensioning, destruction, or transfer during an Automation call.

The requested operation requires an unlocked SAFEARRAY but one or more locks are still active. When this result crosses a language or process boundary, preserve its original numeric form before projections replace it with a broad exception class.

Where the result appears

  • This result is returned while Automation binds or executes SAFEARRAY mutation, redimensioning, destruction, or transfer during an Automation call.

Triage of this result starts by locating the exact owner of the failing state, including object identity, apartment, package, and deployment generation.

Typical causes and interpretation

Common cause categories are: SafeArrayUnaccessData was skipped; nested code holds a lock; an exception bypassed cleanup; another component retains direct access. Do not treat the cause list as a checklist of simultaneous failures; use traces and postconditions to select the matching branch.

Key distinction: the requested operation requires an unlocked SAFEARRAY but one or more locks are still active.

Evidence to preserve

  • Record it with the object CLSID or ProgID, interface identity, member DISPID, dispatch flags, and type-library version.
  • Capture SAFEARRAY pointer; lock count; SafeArrayAccessData calls; exception path; owning thread; by-reference use.

When recording it, retain structural metadata and redact content-bearing arguments, authentication material, and personal data.

Correct handling and recovery

The appropriate recovery is to pair every access with guaranteed unlock, use scoped cleanup, and perform redimension or destruction only after the lock count reaches zero. A retry policy needs a bounded attempt count, a state refresh step, and a rule for reconciling work that may already have completed.

Cleanup following it must be generation-aware: do not destroy shared state or outputs owned by an earlier successful operation.

Practical scenario

A conversion routine throws after SafeArrayAccessData; a finally block is added to call SafeArrayUnaccessData before cleanup.

Coverage should include the exact failure, a corrected success case, and the closest related HRESULT so classification remains stable.

Difference from related HRESULTs

DISP_E_BADVARTYPE concerns the array’s VARIANT tag; it concerns its current synchronization and access state.

Tests and telemetry should retain the producing component and operation so future wrappers do not flatten this result into an ambiguous generic exception.

References


Looking for a different code? Search another status or error code.