Skip to content

IDispatchInvoke: pass IDispatch arguments as VT_DISPATCH#304

Open
TetzkatLipHoka wants to merge 1 commit into
remobjects:masterfrom
TetzkatLipHoka:fix/idispatch-vt-dispatch
Open

IDispatchInvoke: pass IDispatch arguments as VT_DISPATCH#304
TetzkatLipHoka wants to merge 1 commit into
remobjects:masterfrom
TetzkatLipHoka:fix/idispatch-vt-dispatch

Conversation

@TetzkatLipHoka

Copy link
Copy Markdown

Variant parameters holding an IDispatch reference were marshaled like
every other variant: wrapped as VT_VARIANT or VT_BYREF pointing at a
copy of the variant. Lenient automation servers (e.g. the Scripting.*
classes) accept that form, but strict marshalers - most prominently
.NET COM interop - reject it, and assigning an object to an IDispatch
property only works with a plain dispatch argument.

Such arguments are now passed as VT_DISPATCH with the interface pointer
itself (deliberately WITHOUT VT_BYREF, which is known to crash several
COM servers). The variant in Par keeps the reference alive for the
duration of the Invoke call, so no AddRef is needed.

Also replaces the repeated rgvarg[i] indexing with a PVariantArg local
(FPC needs rgvarg^[i]) and the cleanup check with a VT_BYREF mask test
so VT_DISPATCH entries are skipped correctly.

Originally found and fixed in the TetzkatLipHoka fork during .NET
interop testing.

🤖 Generated with Claude Code

Variant parameters holding an IDispatch reference were marshaled like
every other variant: wrapped as VT_VARIANT or VT_BYREF pointing at a
copy of the variant. Lenient automation servers (e.g. the Scripting.*
classes) accept that form, but strict marshalers - most prominently
.NET COM interop - reject it, and assigning an object to an IDispatch
property only works with a plain dispatch argument.

Such arguments are now passed as VT_DISPATCH with the interface pointer
itself (deliberately WITHOUT VT_BYREF, which is known to crash several
COM servers). The variant in Par keeps the reference alive for the
duration of the Invoke call, so no AddRef is needed.

Also replaces the repeated rgvarg[i] indexing with a PVariantArg local
(FPC needs rgvarg^[i]) and the cleanup check with a VT_BYREF mask test
so VT_DISPATCH entries are skipped correctly.

Originally found and fixed in the TetzkatLipHoka fork during .NET
interop testing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant