home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 September / Chip_2002-09_cd1.bin / zkuste / vbasic / Data / Utils / XZipComp.exe / XceedWinsock.Cab / F112643_enumgen.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-03-20  |  2.1 KB  |  63 lines

  1. //////////////////////////////////////////////////////////////////
  2. //
  3. // enumgen.h - Copyright 1997, Don Box
  4. //
  5. // MIDL/C Header that vastly simplifies defining enumerator interfaces
  6. // in IDL. This header file ensures that the generated proxy/stub DLL
  7. // uses the method aliasing technique to allow null for the 3rd parameter 
  8. // to Next. It does this via trickery to say the least.
  9. // 
  10. //
  11. // example:
  12. /*
  13.     enumerator(long, IEnumLong, 12345678-1234-4567-2345-141425253636)
  14.     enumerator(IDispatch *, IEnumDispatch, 12345679-1234-4567-2345-141425253636)
  15.  
  16.     [ uuid(1234567A-1234-4567-2345-141425253636), object ]
  17.     interface IUseEm : IUnknown
  18.     {
  19.       HRESULT GetSomeLongs([out] IEnumLong **ppel);
  20.       HRESULT CallSomeMethod([in] IEnumDispatch *ped, LPCOLESTR pwszMethodName);
  21.     }
  22.  
  23. */
  24. //
  25.  
  26. #ifndef _ENUMGEN_H
  27. #define _ENUMGEN_H
  28.  
  29.  
  30. #if (defined(__midl))
  31.  
  32. #define enumerator(xxx, IEnumXXX) \
  33. interface IEnumXXX : IUnknown { \
  34.   [local] HRESULT Next([in] ULONG cElems, [out] xxx *prgElems, [out] ULONG *pcFetched); \
  35.   [call_as(Next)] HRESULT RemoteNext([in] ULONG cElems, [out, size_is(cElems), length_is(*pcFetched)] xxx *prgElems, [out] ULONG *pcFetched); \
  36.   HRESULT Skip([in] ULONG cElems); \
  37.   HRESULT Reset(void); \
  38.   HRESULT Clone([out] IEnumXXX **ppenum); \
  39. }\
  40. cpp_quote("#ifdef __midl_proxy")\
  41. cpp_quote("#include \"enumgen.h\"")\
  42. cpp_quote("GENERATE_NEXT_CALLAS(")\
  43. cpp_quote(#IEnumXXX)\
  44. cpp_quote(",")\
  45. cpp_quote(#xxx)\
  46. cpp_quote(")")\
  47. cpp_quote("#endif")
  48.  
  49. #else
  50.  
  51. #define GENERATE_NEXT_CALLAS(IEnumXXX, xxx) \
  52. static HRESULT STDMETHODCALLTYPE IEnumXXX##_Next_Proxy\
  53. (IEnumXXX* This, ULONG cElems, xxx *prgElems, ULONG *pcFetched) \
  54. {  ULONG cFetched; if (pcFetched == 0 && cElems > 1) return E_INVALIDARG; else return IEnumXXX##_RemoteNext_Proxy(This, cElems, prgElems, pcFetched ? pcFetched : &cFetched); } \
  55. static HRESULT STDMETHODCALLTYPE \
  56. IEnumXXX##_Next_Stub \
  57. (IEnumXXX * This, ULONG cElems, xxx *prgElems, ULONG *pcFetched) \
  58. {  HRESULT hr = This->lpVtbl->Next(This, cElems, prgElems, pcFetched); if (hr == S_OK && cElems == 1) *pcFetched = 1; return hr; }
  59.  
  60. #endif
  61.  
  62. #endif
  63.