1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 //---------------------------------------------------------------------------------
7 // Defines various standard com interfaces , refer to stdinterfaces.cpp for more documentation
9 //---------------------------------------------------------------------------------
11 #ifndef _H_STDINTERFACES_
12 #define _H_STDINTERFACES_
14 #ifndef FEATURE_COMINTEROP
15 #error FEATURE_COMINTEROP is required for this file
16 #endif // FEATURE_COMINTEROP
19 #include "weakreference.h"
22 extern const IID IID_IWeakReferenceSource;
23 extern const IID IID_IWeakReference;
24 extern const IID IID_ICustomPropertyProvider;
25 extern const IID IID_ICCW;
27 // Until the Windows SDK is updated, just hard-code the IAgileObject IID
28 #ifndef __IAgileObject_INTERFACE_DEFINED__
29 DEFINE_GUID(IID_IAgileObject,0x94ea2b94,0xe9cc,0x49e0,0xc0,0xff,0xee,0x64,0xca,0x8f,0x5b,0x90);
30 MIDL_INTERFACE("94ea2b94-e9cc-49e0-c0ff-ee64ca8f5b90")
31 IAgileObject : public IUnknown
35 #endif // !__IAgileObject_INTERFACE_DEFINED__
37 // Until the Windows SDK is updated, just hard-code the INoMarshal IID
38 #ifndef __INoMarshal_INTERFACE_DEFINED__
39 DEFINE_GUID(IID_INoMarshal,0xecc8691b,0xc1db,0x4dc0,0x85,0x5e,0x65,0xf6,0xc5,0x51,0xaf,0x49);
40 MIDL_INTERFACE("ecc8691b-c1db-4dc0-855e-65f6c551af49")
41 INoMarshal : public IUnknown
45 #endif // !__INoMarshal_INTERFACE_DEFINED__
51 struct ITypeLibExporterNotifySink;
53 typedef HRESULT (__stdcall* PCOMFN)(void);
55 //------------------------------------------------------------------------------------------
56 // HRESULT's returned by GetITypeInfoForEEClass.
57 #define S_USEIUNKNOWN (HRESULT)2
58 #define S_USEIDISPATCH (HRESULT)3
60 // For free-threaded marshaling, we must not be spoofed by out-of-process or cross-runtime marshal data.
61 // Only unmarshal data that comes from our own runtime.
62 extern BYTE g_UnmarshalSecret[sizeof(GUID)];
63 extern bool g_fInitedUnmarshalSecret;
65 struct ExportTypeLibFromLoadedAssembly_Args
70 ITypeLibExporterNotifySink* pINotify;
75 // make sure to keep the following enum and the g_stdVtables array in sync
76 enum Enum_StdInterfaces
78 enum_InnerUnknown = 0,
79 enum_IProvideClassInfo,
81 enum_ISupportsErrorInfo,
84 enum_IConnectionPointContainer,
87 enum_IWeakReferenceSource,
88 enum_ICustomPropertyProvider,
92 // add your favorite std interface here
95 enum_IUnknown = 0xff, // special enum for std unknown
98 // array of vtable pointers for std. interfaces such as IProvideClassInfo etc.
99 extern const SLOT * const g_rgStdVtables[];
101 template <size_t nVtableEntries>
102 struct StdInterfaceDesc
104 // This is a self-describing vtable pointer.
105 Enum_StdInterfaces m_StdInterfaceKind;
106 UINT_PTR const * const m_vtable[nVtableEntries];
109 typedef DPTR(StdInterfaceDesc<1>) PTR_StdInterfaceDesc;
110 typedef VPTR(IUnknown) PTR_IUnknown;
112 inline static Enum_StdInterfaces GetStdInterfaceKind(PTR_IUnknown pUnk)
114 LIMITED_METHOD_DAC_CONTRACT;
116 PTR_SLOT pVtable = dac_cast<PTR_SLOT>(*(dac_cast<PTR_TADDR>(pUnk)));
117 PTR_StdInterfaceDesc pDesc = dac_cast<PTR_StdInterfaceDesc>(dac_cast<PTR_BYTE>(pVtable) - offsetof(StdInterfaceDesc<1>, m_vtable));
119 #ifndef DACCESS_COMPILE
120 // Make sure the interface kind is the right one
121 // Only do this in non-DAC build as I don't want to bring in g_rgStdVtables global variable
122 _ASSERTE(g_rgStdVtables[pDesc->m_StdInterfaceKind] == pVtable);
123 #endif // !DACCESS_COMPILE
125 return pDesc->m_StdInterfaceKind;
129 // IUnknown is part of IDispatch
130 // Common vtables for well-known COM interfaces
131 // shared by all COM+ callable wrappers.
132 extern const StdInterfaceDesc<3> g_InnerUnknown;
133 extern const StdInterfaceDesc<4> g_IProvideClassInfo;
134 extern const StdInterfaceDesc<9> g_IMarshal;
135 extern const StdInterfaceDesc<4> g_ISupportsErrorInfo;
136 extern const StdInterfaceDesc<8> g_IErrorInfo;
137 extern const StdInterfaceDesc<5> g_IManagedObject;
138 extern const StdInterfaceDesc<5> g_IConnectionPointContainer;
139 extern const StdInterfaceDesc<5> g_IObjectSafety;
140 extern const StdInterfaceDesc<15> g_IDispatchEx;
141 extern const StdInterfaceDesc<4> g_IWeakReferenceSource;
142 extern const StdInterfaceDesc<10> g_ICustomPropertyProvider;
143 extern const StdInterfaceDesc<7> g_ICCW;
144 extern const StdInterfaceDesc<3> g_IAgileObject;
145 extern const StdInterfaceDesc<7> g_IStringable;
150 enum_UserDefined = 0,
160 //-------------------------------------------------------------------------
161 // IProvideClassInfo methods
162 HRESULT __stdcall ClassInfo_GetClassInfo_Wrapper(IUnknown* pUnk,
163 ITypeInfo** ppTI); //Address of output variable that receives the type info.
165 // ---------------------------------------------------------------------------
166 // Interface ISupportsErrorInfo
168 // %%Function: SupportsErroInfo_IntfSupportsErrorInfo,
169 // ---------------------------------------------------------------------------
171 SupportsErroInfo_IntfSupportsErrorInfo_Wrapper(IUnknown* pUnk, REFIID riid);
173 // ---------------------------------------------------------------------------
174 // Interface IErrorInfo
176 // %%Function: ErrorInfo_GetDescription,
177 HRESULT __stdcall ErrorInfo_GetDescription_Wrapper(IUnknown* pUnk, BSTR* pbstrDescription);
179 // %%Function: ErrorInfo_GetGUID,
180 HRESULT __stdcall ErrorInfo_GetGUID_Wrapper(IUnknown* pUnk, GUID* pguid);
182 // %%Function: ErrorInfo_GetHelpContext,
183 HRESULT _stdcall ErrorInfo_GetHelpContext_Wrapper(IUnknown* pUnk, DWORD* pdwHelpCtxt);
185 // %%Function: ErrorInfo_GetHelpFile,
186 HRESULT __stdcall ErrorInfo_GetHelpFile_Wrapper(IUnknown* pUnk, BSTR* pbstrHelpFile);
188 // %%Function: ErrorInfo_GetSource,
189 HRESULT __stdcall ErrorInfo_GetSource_Wrapper(IUnknown* pUnk, BSTR* pbstrSource);
191 //------------------------------------------------------------------------------------------
192 // IDispatch methods for COM+ objects. These methods dispatch to the appropriate
193 // implementation based on the flags of the class that implements them.
196 // %%Function: IDispatch::GetTypeInfoCount
197 HRESULT __stdcall Dispatch_GetTypeInfoCount_Wrapper (
199 unsigned int *pctinfo);
202 // %%Function: IDispatch::GetTypeInfo
203 HRESULT __stdcall Dispatch_GetTypeInfo_Wrapper (
207 ITypeInfo **pptinfo);
209 // %%Function: IDispatch::GetIDsofNames
210 HRESULT __stdcall Dispatch_GetIDsOfNames_Wrapper (
213 __in_ecount(cNames) OLECHAR **rgszNames,
218 // %%Function: IDispatch::Invoke
219 HRESULT __stdcall Dispatch_Invoke_Wrapper (
224 unsigned short wFlags,
225 DISPPARAMS *pdispparams,
227 EXCEPINFO *pexcepinfo,
228 unsigned int *puArgErr
231 // %%Function: IDispatch::GetIDsofNames
232 HRESULT __stdcall InternalDispatchImpl_GetIDsOfNames_Wrapper (
235 __in_ecount(cNames) OLECHAR **rgszNames,
240 // %%Function: IDispatch::Invoke
241 HRESULT __stdcall InternalDispatchImpl_Invoke_Wrapper (
246 unsigned short wFlags,
247 DISPPARAMS *pdispparams,
249 EXCEPINFO *pexcepinfo,
250 unsigned int *puArgErr
253 //------------------------------------------------------------------------------------------
254 // IDispatchEx methods for COM+ objects
257 // %%Function: IDispatchEx::GetTypeInfoCount
258 HRESULT __stdcall DispatchEx_GetTypeInfoCount_Wrapper (
260 unsigned int *pctinfo);
263 // %%Function: IDispatch::GetTypeInfo
264 HRESULT __stdcall DispatchEx_GetTypeInfo_Wrapper (
268 ITypeInfo **pptinfo);
270 // IDispatchEx::GetIDsofNames
271 HRESULT __stdcall DispatchEx_GetIDsOfNames_Wrapper (
274 __in_ecount(cNames) OLECHAR **rgszNames,
279 // IDispatchEx::Invoke
280 HRESULT __stdcall DispatchEx_Invoke_Wrapper (
285 unsigned short wFlags,
286 DISPPARAMS *pdispparams,
288 EXCEPINFO *pexcepinfo,
289 unsigned int *puArgErr);
291 // IDispatchEx::DeleteMemberByDispID
292 HRESULT __stdcall DispatchEx_DeleteMemberByDispID_Wrapper (
296 // IDispatchEx::DeleteMemberByName
297 HRESULT __stdcall DispatchEx_DeleteMemberByName_Wrapper (
303 // IDispatchEx::GetDispID
304 HRESULT __stdcall DispatchEx_GetDispID_Wrapper (
311 // IDispatchEx::GetMemberName
312 HRESULT __stdcall DispatchEx_GetMemberName_Wrapper (
317 // IDispatchEx::GetMemberProperties
318 HRESULT __stdcall DispatchEx_GetMemberProperties_Wrapper (
324 // IDispatchEx::GetNameSpaceParent
325 HRESULT __stdcall DispatchEx_GetNameSpaceParent_Wrapper (
329 // IDispatchEx::GetNextDispID
330 HRESULT __stdcall DispatchEx_GetNextDispID_Wrapper (
336 // IDispatchEx::InvokeEx
337 HRESULT __stdcall DispatchEx_InvokeEx_Wrapper (
345 IServiceProvider *pspCaller);
347 //------------------------------------------------------------------------------------------
348 // IInspectable methods for managed objects
350 // IInspectable::GetIIDs
351 HRESULT __stdcall Inspectable_GetIIDs_Wrapper (
356 // IInspectable::GetRuntimeClassName
357 HRESULT __stdcall Inspectable_GetRuntimeClassName_Wrapper (
361 // IInspectable::GetTrustLevel
362 HRESULT __stdcall Inspectable_GetTrustLevel_Wrapper (
364 TrustLevel *trustLevel);
366 //------------------------------------------------------------------------------------------
367 // IWeakReferenceSource methods for managed objects
369 HRESULT __stdcall WeakReferenceSource_GetWeakReference_Wrapper (
370 IWeakReferenceSource *pRefSrc,
371 IWeakReference **weakReference);
373 //------------------------------------------------------------------------------------------
374 // IMarshal methods for COM+ objects
376 HRESULT __stdcall Marshal_GetUnmarshalClass_Wrapper (
378 REFIID riid, void * pv, ULONG dwDestContext,
379 void * pvDestContext, ULONG mshlflags,
382 HRESULT __stdcall Marshal_GetMarshalSizeMax_Wrapper (
384 REFIID riid, void * pv, ULONG dwDestContext,
385 void * pvDestContext, ULONG mshlflags,
388 HRESULT __stdcall Marshal_MarshalInterface_Wrapper (
390 LPSTREAM pStm, REFIID riid, void * pv,
391 ULONG dwDestContext, LPVOID pvDestContext,
394 HRESULT __stdcall Marshal_UnmarshalInterface_Wrapper (
396 LPSTREAM pStm, REFIID riid,
399 HRESULT __stdcall Marshal_ReleaseMarshalData_Wrapper (IMarshal* pMarsh, LPSTREAM pStm);
401 HRESULT __stdcall Marshal_DisconnectObject_Wrapper (IMarshal* pMarsh, ULONG dwReserved);
404 //------------------------------------------------------------------------------------------
405 // IManagedObject methods for COM+ objects
407 interface IManagedObject;
409 HRESULT __stdcall ManagedObject_GetObjectIdentity_Wrapper(IManagedObject *pManaged,
410 BSTR* pBSTRGUID, DWORD* pAppDomainID,
414 HRESULT __stdcall ManagedObject_GetSerializedBuffer_Wrapper(IManagedObject *pManaged,
418 //------------------------------------------------------------------------------------------
419 // IConnectionPointContainer methods for COM+ objects
421 interface IEnumConnectionPoints;
423 HRESULT __stdcall ConnectionPointContainer_EnumConnectionPoints_Wrapper(IUnknown* pUnk,
424 IEnumConnectionPoints **ppEnum);
426 HRESULT __stdcall ConnectionPointContainer_FindConnectionPoint_Wrapper(IUnknown* pUnk,
428 IConnectionPoint **ppCP);
431 //------------------------------------------------------------------------------------------
432 // IObjectSafety methods for COM+ objects
434 interface IObjectSafety;
436 HRESULT __stdcall ObjectSafety_GetInterfaceSafetyOptions_Wrapper(IUnknown* pUnk,
438 DWORD *pdwSupportedOptions,
439 DWORD *pdwEnabledOptions);
441 HRESULT __stdcall ObjectSafety_SetInterfaceSafetyOptions_Wrapper(IUnknown* pUnk,
443 DWORD dwOptionSetMask,
444 DWORD dwEnabledOptions);
447 //------------------------------------------------------------------------------------------
448 // ICustomPropertyProvider methods for Jupiter
449 HRESULT __stdcall ICustomPropertyProvider_GetProperty_Wrapper(IUnknown *pPropertyProvider,
451 /* [out] */ IUnknown **ppProperty);
453 // Windows.UI.DirectUI.Xaml.TypeNameNative
454 struct TypeNameNative
460 HRESULT __stdcall ICustomPropertyProvider_GetIndexedProperty_Wrapper(IUnknown *pPropertyProvider,
462 TypeNameNative indexedParamType,
463 /* [out, retval] */ IUnknown **ppProperty);
465 HRESULT __stdcall ICustomPropertyProvider_GetStringRepresentation_Wrapper(IUnknown *pPropertyProvider,
466 /* [out, retval] */ HSTRING *phstrStringRepresentation);
468 HRESULT __stdcall ICustomPropertyProvider_GetType_Wrapper(IUnknown *pPropertyProvider,
469 /* [out, retval] */ TypeNameNative *pTypeIdentifier);
471 HRESULT __stdcall IStringable_ToString_Wrapper(IUnknown* pStringable,
472 /* [out, retval] */ HSTRING* result);
474 //------------------------------------------------------------------------------------------
475 // ICCW methods for Jupiter
476 ULONG __stdcall ICCW_AddRefFromJupiter_Wrapper(IUnknown *pUnk);
478 ULONG __stdcall ICCW_ReleaseFromJupiter_Wrapper(IUnknown *pUnk);
480 HRESULT __stdcall ICCW_Peg_Wrapper(IUnknown *pUnk);
482 HRESULT __stdcall ICCW_Unpeg_Wrapper(IUnknown *pUnk);
487 VOID __stdcall DirtyCast_Assert(IUnknown* pUnk);
492 // prototypes IUnknown methods
493 HRESULT __stdcall Unknown_QueryInterface(IUnknown* pUnk, REFIID riid, void** ppv);
494 HRESULT __stdcall Unknown_QueryInterface_ICCW(IUnknown *pUnk, REFIID riid, void **ppv);
496 ULONG __stdcall Unknown_AddRef(IUnknown* pUnk);
497 ULONG __stdcall Unknown_Release(IUnknown* pUnk);
498 ULONG __stdcall Unknown_AddRefInner(IUnknown* pUnk);
499 ULONG __stdcall Unknown_ReleaseInner(IUnknown* pUnk);
501 // for std interfaces such as IProvideClassInfo
502 HRESULT __stdcall Unknown_QueryInterface_IErrorInfo(IUnknown* pUnk, REFIID riid, void** ppv);
503 ULONG __stdcall Unknown_AddRefSpecial(IUnknown* pUnk);
504 ULONG __stdcall Unknown_ReleaseSpecial(IUnknown* pUnk);
505 ULONG __stdcall Unknown_ReleaseSpecial_IErrorInfo(IUnknown* pUnk);
508 // special idispatch methods
511 InternalDispatchImpl_GetIDsOfNames (
514 __in_ecount(cNames) OLECHAR **rgszNames,
521 InternalDispatchImpl_Invoke (
526 unsigned short wFlags,
527 DISPPARAMS *pdispparams,
529 EXCEPINFO *pexcepinfo,
530 unsigned int *puArgErr);
532 //------------------------------------------------------------------------------------------
533 // Helper to get the current IErrorInfo if the specified interface supports it.
534 IErrorInfo *GetSupportedErrorInfo(IUnknown *iface, REFIID riid, BOOL checkForIRestrictedErrInfo = TRUE);
536 //------------------------------------------------------------------------------------------
537 // Helper functions that return HRESULT's instead of throwing exceptions.
538 HRESULT TryGetGuid(MethodTable* pClass, GUID* pGUID, BOOL b);
540 //------------------------------------------------------------------------------------------
541 // Helpers to get the ITypeInfo* for a type.
542 HRESULT ExportTypeLibFromLoadedAssemblyNoThrow(Assembly *pAssembly, LPCWSTR szTlb, ITypeLib **ppTlb, ITypeLibExporterNotifySink *pINotify, int flags);
543 void ExportTypeLibFromLoadedAssembly(Assembly *pAssembly, LPCWSTR szTlb, ITypeLib **ppTlb, ITypeLibExporterNotifySink *pINotify, int flags);
544 HRESULT GetITypeLibForEEClass(MethodTable *pMT, ITypeLib **ppTLB, int bAutoCreate, int flags);
545 HRESULT GetITypeInfoForEEClass(MethodTable *pMT, ITypeInfo **ppTI, int bClassInfo=false, int bAutoCreate=true, int flags=0);
546 HRESULT GetTypeLibIdForRegisteredEEClass(MethodTable *pMT, GUID *pGuid);
547 HRESULT GetDefaultInterfaceForCoclass(ITypeInfo *pTI, ITypeInfo **ppTIDef);
549 //-------------------------------------------------------------------------------------
550 // Helper to get the ITypeLib* for a Assembly.
551 HRESULT GetITypeLibForAssembly(Assembly *pAssembly, ITypeLib **ppTLB, int bAutoCreate, int flags);
553 //-------------------------------------------------------------------------------------
554 // Helper to get the GUID of the typelib that is created from an assembly.
555 HRESULT GetTypeLibGuidForAssembly(Assembly *pAssembly, GUID *pGuid);
557 //-------------------------------------------------------------------------------------
558 // Helper for IInspectable's GetRuntimeClassName on an IReference<T> or IReferenceArray<T>.
559 void GetRuntimeClassNameForIReferenceOrIReferenceArray(MethodTable* pInstantiatedType, BOOL fIsIReferenceArray, SString& className);