È possibile utilizzare la direttiva assemblatore vmtoffset
per ottenere l'offset di byte di un metodo di interfaccia relativo all'inizio della tabella dei metodi dell'interfaccia. Date un'occhiata a l'attuazione di _IntfCast
in System.pas, ad esempio:
call dword ptr [eax] + vmtoffset IInterface.QueryInterface
...
call dword ptr [eax] + vmtoffset IInterface._Release
La prima espressione aggiunge 0; il secondo, 8.
Tuttavia, non è possibile parametrizzare tali espressioni. Sono costanti in fase di compilazione, quindi non è possibile scegliere quale metodo si desidera in fase di esecuzione. È necessario avere tutti i possibili nomi dei metodi rappresentati in anticipo.
Tutto quello che in realtà deve agganciare è QueryInterface
. Una volta ottenuto ciò, è possibile restituire qualsiasi oggetto proxy desiderato che possa intercettare le chiamate a tutti gli altri metodi.
fonte
2010-07-02 05:07:12
Delphi porta via un sacco di tutti i dettagli cruenti COM, penso che si vuole fare un po 'troppo da soli. Cosa stai cercando di ottenere? Crea il tuo server COM o ne usi uno esistente? –
Vuoi lo spostamento numerico del metodo nell'interfaccia (ad esempio IUnknown.QueryInterface è 0), l'indirizzo del metodo nella classe che implementa tale metodo di interfaccia (ad esempio, @ TInterfacedObject.QueryInterface) o l'indirizzo del metodo codice stub generato per collegare una chiamata all'interfaccia al metodo dell'oggetto corrispondente? Quest'ultimo è memorizzato nella tabella di interfaccia della classe. –
@The_Fox: Nessuno dei due: intercetto le chiamate a un oggetto COM esterno utilizzando Win32Hook.pas. @Rob Kennedy: non esiste una classe TInterfacedObject - ho solo un'interfaccia implementata da una DLL esterna. –