OK, I see. I've tested another example with my current CoInvoke macro: pInterface equ esi
INT 3
CoInvoke pInterface, IWebBrowserVtbl.put_MenuBar, VARIANT_TRUE ; false = no menu
nops 4
This translates to:
int3
push 0FFFF ; VARIANT_TRUE
push esi ; pInterface
mov eax, [esi]
call near [eax+0C4] ; method
nop
So, when using the interface a second time, one could save the mov eax, [esi] step and use once mov ebx, [esi] instead. That saves two bytes, but you need a non-volatile register like ebx, so two bytes for push+pop. Which means you can save two bytes each for the third, fourth, ... use of the interface. In short: You are right, one can save some bytes by coding this stuff by hand :t