Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

575 lines
18 KiB

  1. #ifndef _PRIV_H_
  2. #define _PRIV_H_
  3. // For use with VC6
  4. #pragma warning(4:4519) //default template arguments are only allowed on a class template; ignored
  5. #pragma warning(4:4242) //'initializing' : conversion from 'unsigned int' to 'unsigned short', possible loss of data
  6. // Extra error checking (catches false errors, but useful to run every so often)
  7. #if 0
  8. #pragma warning(3:4701) // local may be used w/o init
  9. #pragma warning(3:4702) // Unreachable code
  10. #pragma warning(3:4705) // Statement has no effect
  11. #pragma warning(3:4709) // command operator w/o index expression
  12. #endif
  13. // Sundown: forcing value to bool
  14. #pragma warning(disable:4800)
  15. // This stuff must run on Win95
  16. #define _WIN32_WINDOWS 0x0400
  17. #ifndef WINVER
  18. #define WINVER 0x0400
  19. #endif
  20. #define _OLEAUT32_ // get DECLSPEC_IMPORT stuff right, we are defing these
  21. #define _BROWSEUI_ // define bruiapi as functions exported instead of imported
  22. #define _WINMM_ // for DECLSPEC_IMPORT in mmsystem.h
  23. #define _WINX32_ // get DECLSPEC_IMPORT stuff right for WININET API
  24. #define _URLCACHEAPI // get DECLSPEC_IMPORT stuff right for WININET CACHE API
  25. #define _UXTHEME_ // get DECLSPEC_IMPORT stuff right for uxtheme
  26. #ifndef STRICT
  27. #define STRICT
  28. #endif
  29. // Map KERNEL32 unicode string functions to SHLWAPI
  30. // This is needed way up here.
  31. #define lstrcmpW StrCmpW
  32. #define lstrcmpiW StrCmpIW
  33. #define lstrcpyW StrCpyW
  34. #define lstrcpynW StrCpyNW
  35. #define lstrcatW StrCatW
  36. //
  37. // Enable channel code for IE4 upgrades.
  38. //
  39. #define ENABLE_CHANNELS
  40. #ifdef __cplusplus
  41. extern "C" { /* Assume C declarations for C++. */
  42. #endif /* __cplusplus */
  43. #include <nt.h>
  44. #include <ntrtl.h>
  45. #include <nturtl.h>
  46. #ifdef __cplusplus
  47. } /* End of extern "C" {. */
  48. #endif /* __cplusplus */
  49. /////////////////////////////////////////////////////////////////////////
  50. //
  51. // ATL / OLE HACKHACK
  52. //
  53. // Include <w95wraps.h> before anything else that messes with names.
  54. // Although everybody gets the wrong name, at least it's *consistently*
  55. // the wrong name, so everything links.
  56. //
  57. // NOTE: This means that while debugging you will see functions like
  58. // CWindowImplBase__DefWindowProcWrapW when you expected to see
  59. // CWindowImplBase__DefWindowProc.
  60. //
  61. #define POST_IE5_BETA // turn on post-split iedev stuff
  62. #include <w95wraps.h>
  63. #include <windows.h>
  64. // VariantInit is a trivial function -- avoid using OleAut32, use intrinsic
  65. // version of memset for a good size win
  66. // (it's here so that atl (in stdafx.h) gets it too)
  67. #define VariantInit(p) memset(p, 0, sizeof(*(p)))
  68. #define _FIX_ENABLEMODELESS_CONFLICT // for shlobj.h
  69. //WinInet need to be included BEFORE ShlObjp.h
  70. #define HLINK_NO_GUIDS
  71. #include <hlink.h>
  72. #include <wininet.h>
  73. #include <winineti.h>
  74. #include <urlmon.h>
  75. #undef GetClassInfo
  76. #include <shlobj.h>
  77. #include <exdispid.h>
  78. #undef GetClassInfo
  79. #include <objidl.h>
  80. #include <shlwapi.h>
  81. //#include <shconv.h> // replacement for atlconv.h if ATL is not included below
  82. #if defined(__cplusplus) && !defined(DONT_USE_ATL)
  83. // (stdafx.h must come before windowsx.h)
  84. #include "stdafx.h" // ATL header file for this component
  85. // AtlMisc.h needs some defines from AtlApp.h
  86. #ifndef __ATLAPP_H__
  87. #include "AtlApp.h"
  88. #endif
  89. // include CString, CSize, CRect, CPoint, CFindFile from WTL10
  90. // see %_NTROOT%\public\sdk\inc\wtl10
  91. #include "AtlMisc.h"
  92. // Include LBSTR::CString
  93. #include <locbstr.h>
  94. #endif
  95. #include <windowsx.h>
  96. #include <shellapi.h>
  97. #include <crtfree.h>
  98. #include <ole2ver.h>
  99. #include <olectl.h>
  100. #include <hliface.h>
  101. #include <docobj.h>
  102. #define DLL_IS_ROOTABLE
  103. #include <ccstock.h>
  104. #include <ccstock2.h>
  105. #include <port32.h>
  106. #include <shellp.h>
  107. #include <ieguidp.h>
  108. #include <isguids.h>
  109. #include <mimeinfo.h>
  110. #include <hlguids.h>
  111. #include <mshtmdid.h>
  112. #include <dispex.h> // IDispatchEx
  113. #include <perhist.h>
  114. #include <shobjidl.h>
  115. #include <iepriv.h>
  116. #include <help.h>
  117. #include <krnlcmn.h> // GetProcessDword
  118. #include <multimon.h>
  119. #define DISALLOW_Assert // Force to use ASSERT instead of Assert
  120. #define DISALLOW_DebugMsg // Force to use TraceMsg instead of DebugMsg
  121. #include <debug.h>
  122. #include <urlhist.h>
  123. #include <regstr.h> // for REGSTR_PATH_EXPLORE
  124. #define USE_SYSTEM_URL_MONIKER
  125. #include <urlmon.h>
  126. #include <winineti.h> // Cache APIs & structures
  127. #include <inetreg.h>
  128. #define _INTSHCUT_ // get DECLSPEC_IMPORT stuff right for INTSHCUT.h
  129. #include <intshcut.h>
  130. #include <propset.h> // If this ever becomes a problem, remove this once OLE adds an official header
  131. #include <regapix.h> // MAXIMUM_SUB_KEY_LENGTH, MAXIMUM_VALUE_NAME_LENGTH, MAXIMUM_DATA_LENGTH
  132. #include <browseui.h>
  133. #include <shdocvw.h>
  134. #include <commctrl.h>
  135. #include <shfusion.h>
  136. //
  137. // WARNING: Don't add private header files in shdocvw here randomly, which
  138. // will force us to re-compiling everything. Keep those private headers
  139. // out of priv.h
  140. //
  141. // #include <iface.h>
  142. #include "globals.h"
  143. #include "runonnt.h"
  144. #include "util.h"
  145. #include "brutil.h"
  146. #include "qistub.h"
  147. #ifdef DEBUG
  148. #include "dbutil.h"
  149. #endif
  150. // Include the automation definitions...
  151. #include <exdisp.h>
  152. #include <exdispid.h>
  153. #include <brdispp.h>
  154. #include <ocmm.h>
  155. #include <mshtmhst.h>
  156. #include <simpdata.h>
  157. #include <htiface.h>
  158. #include <objsafe.h>
  159. #include "shui.h"
  160. #define URLID_URLBASE 0
  161. #define URLID_LOCATION 1
  162. /////// URLID_FTPFOLDER 2 // Taken by a pre-release FTP Folder dll
  163. #define URLID_PROTOCOL 3
  164. // If stdshnor.bmp or stdshhot.bmp are modifed, change this number to reflect the
  165. // new number of glyphs
  166. #define NUMBER_SHELLGLYPHS 47
  167. #define MAX_SHELLGLYPHINDEX SHELLTOOLBAR_OFFSET + NUMBER_SHELLGLYPHS - 1
  168. // Increment steps. For changing the with of the TB buttons. For localization
  169. #define WIDTH_FACTOR 4
  170. //
  171. // Neutral ANSI/UNICODE types and macros... 'cus Chicago seems to lack them
  172. //
  173. #define DLL_IS_UNICODE (sizeof(TCHAR) == sizeof(WCHAR))
  174. //===========================================================================
  175. // ITEMIDLIST
  176. //===========================================================================
  177. // unsafe macros
  178. #define _ILSkip(pidl, cb) ((LPITEMIDLIST)(((BYTE*)(pidl))+cb))
  179. #define _ILNext(pidl) _ILSkip(pidl, (pidl)->mkid.cb)
  180. #define SEN_FIRST (0U-550U) // ;Internal
  181. #ifdef __cplusplus
  182. //
  183. // Pseudoclass for the variable-sized OLECMDTEXT structure.
  184. // You need to declare it as a class (and not a BYTE buffer that is
  185. // suitable cast) because BYTE buffers are not guaranteed to be aligned.
  186. //
  187. template <int n>
  188. class OLECMDTEXTV : public OLECMDTEXT {
  189. WCHAR wszBuf[n-1]; // "-1" because OLECMDTEXT includes 1 wchar
  190. };
  191. extern "C" { /* Assume C declarations for C++. */
  192. #endif /* __cplusplus */
  193. void CInternetToolbar_CleanUp();
  194. void CUserAssist_CleanUp(DWORD dwReason, LPVOID lpvReserved);
  195. void CBrandBand_CleanUp();
  196. STDAPI_(HCURSOR) LoadHandCursor(DWORD dwRes);
  197. // Count of images Currently - 2 (Normal and Hot)
  198. #define CIMLISTS 2
  199. typedef struct tagIMLCACHE
  200. {
  201. HIMAGELIST arhiml[CIMLISTS];
  202. HIMAGELIST arhimlPendingDelete[CIMLISTS];
  203. COLORREF cr3D;
  204. BOOL fSmallIcons;
  205. BOOL fUseClassicGlyphs;
  206. } IMLCACHE;
  207. void IMLCACHE_CleanUp(IMLCACHE * pimlCache, DWORD dwFlags);
  208. #define IML_DELETEPENDING 0x01
  209. #define IML_DESTROY 0x02
  210. extern const ITEMIDLIST c_idlDesktop;
  211. typedef const BYTE *LPCBYTE;
  212. #define RECTWIDTH(rc) ((rc).right-(rc).left)
  213. #define RECTHEIGHT(rc) ((rc).bottom-(rc).top)
  214. #define EnterModeless() AddRef() // Used for selfref'ing
  215. #define ExitModeless() Release()
  216. //
  217. // Debug helper functions
  218. //
  219. #ifdef DEBUG
  220. LPCTSTR Dbg_GetCFName(UINT ucf);
  221. LPCTSTR Dbg_GetHRESULTName(HRESULT hr);
  222. LPCTSTR Dbg_GetREFIIDName(REFIID riid);
  223. LPCTSTR Dbg_GetVTName(VARTYPE vt);
  224. BOOL IsStringContained(LPCTSTR pcszBigger, LPCTSTR pcszSuffix);
  225. #endif // DEBUG
  226. //
  227. // In DEBUG, send all our class registrations through a wrapper that
  228. // checks that the class is on our unregister-at-unload list.
  229. //
  230. #ifdef DEBUG
  231. #undef SHRegisterClass
  232. #undef RegisterClass
  233. #define SHRegisterClass SHRegisterClassD
  234. #define RegisterClass RegisterClassD
  235. STDAPI_(BOOL) SHRegisterClassD(CONST WNDCLASS* pwc);
  236. STDAPI_(ATOM) RegisterClassD(CONST WNDCLASS* pwc);
  237. #ifdef UNICODE
  238. #define RealSHRegisterClass SHRegisterClassW
  239. #define RealRegisterClass RegisterClassWrapW
  240. #else
  241. #define RealSHRegisterClass SHRegisterClassA
  242. #define RealRegisterClass RegisterClassA
  243. #endif // UNICODE
  244. #endif // DEBUG
  245. //
  246. // In DEBUG, send FindWindow through a wrapper that ensures that the
  247. // critical section is not taken. FindWindow sends interthreadmessages,
  248. // which is not obvious.
  249. //
  250. #ifdef DEBUG
  251. #undef FindWindow
  252. #undef FindWindowEx
  253. #define FindWindow FindWindowD
  254. #define FindWindowEx FindWindowExD
  255. STDAPI_(HWND) FindWindowD (LPCTSTR lpClassName, LPCTSTR lpWindowName);
  256. STDAPI_(HWND) FindWindowExD(HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpClassName, LPCTSTR lpWindowName);
  257. #ifdef UNICODE
  258. #define RealFindWindowEx FindWindowExWrapW
  259. #else
  260. #define RealFindWindowEx FindWindowExA
  261. #endif // UNICODE
  262. #endif // DEBUG
  263. //
  264. // Trace/dump/break flags specific to shell32\.
  265. // (Standard flags defined in shellp.h)
  266. //
  267. // Break flags
  268. #define BF_ONDUMPMENU 0x10000000 // Stop after dumping menus
  269. #define BF_ONLOADED 0x00000010 // Stop when loaded
  270. // Trace flags
  271. #define TF_UEM 0x00000010 // UEM stuff
  272. #define TF_AUTOCOMPLETE 0x00000100 // AutoCompletion
  273. // The following aren't really valid until the ccshell.ini file is updated.
  274. #define TF_SHDLIFE 0x00000200
  275. #define TF_SHDREF 0x00000400
  276. #define TF_SHDPERF 0x00000800
  277. #define TF_SHDAUTO 0x00001000
  278. #define TF_MENUBAND 0x00002000 // Menu band messages
  279. #define TF_SITEMAP 0x00004000 // Sitemap messages
  280. #define TF_SHDTHREAD 0x00008000 // Thread management
  281. #define TF_SHDCONTROL 0x00010000 // ActiveX Control
  282. #define TF_SHDAPPHACK 0x00020000 // Hack for app-bug
  283. #define TF_SHDBINDING 0x00040000 // Moniker binding
  284. #define TF_SHDPROGRESS 0x00080000 // Download progress
  285. #define TF_SHDNAVIGATE 0x00100000 // Navigation
  286. #define TF_SHDUIACTIVATE 0x00200000 // UI-Activation/Deactivation
  287. #define TF_OCCONTROL 0x00400000 // OC Hosting Window Control
  288. #define TF_PIDLWRAP 0x00800000 // Pidl / Protocol wrapping
  289. #define TF_REGCHECK 0x00000100 // Registry check stuff
  290. #define TF_COCREATE 0x02000000 // WinList/CoCreate(Browser only)
  291. #define TF_URLNAMESPACE 0x04000000 // URL Name Space
  292. #define TF_BAND 0x08000000 // Bands (ISF Band, etc)
  293. #define TF_TRAVELLOG 0x10000000 // TravelLog and Navigation stack
  294. #define TF_DDE 0x20000000 // PMDDE traces
  295. #define TF_CUSTOM1 0x40000000 // Custom messages #1
  296. #define TF_CUSTOM2 0x80000000 // Custom messages #2
  297. #define TF_ACCESSIBILITY TF_CUSTOM2 // accessibility messages: tabstop handling, get/lose tab focus, accelerators
  298. //There is some thinking that says this should be removed, but why risk the regression
  299. #define TF_OBJECTCACHE TF_TRAVELLOG
  300. // (Re-use TF_CUSTOM1 and TF_CUSTOM2 by defining a TF_ value in your
  301. // local file to one of these values while you have the file checked
  302. // out.)
  303. // Dump flags
  304. #define DF_SITEMAP 0x00000001 // Sitemap
  305. #define DF_MEMLEAK 0x00000002 // Dump leaked memory at the end
  306. #define DF_DEBUGQI 0x00000004 // Alloc stub object for each QI
  307. #define DF_DEBUGQINOREF 0x00000008 // No AddRef/Release QI stub
  308. #define DF_DEBUGMENU 0x00000010 // Dump menu handles
  309. #define DF_URL 0x00000020 // Display URLs
  310. #define DF_AUTOCOMPLETE 0x00000040 // AutoCompletion
  311. #define DF_DELAYLOADDLL 0x00000080 // Delay-loaded DLL
  312. #define DF_SHELLLIST 0x00000100 // CShellList contents
  313. #define DF_INTSHCUT 0x00000200 // Internet shortcut structs
  314. #define DF_URLPROP 0x00000400 // URL properties
  315. #define DF_MSGHOOK 0x00000800 // Menu MessageFilter
  316. #define DF_GETMSGHOOK 0x00001000 // GetMessageFilter
  317. #define DF_TRANSACCELIO 0x00002000 // GetMessageFilter
  318. // Prototype flags
  319. #define PF_USERMENUS 0x00000001 // Use traditional USER menu bar
  320. #define PF_NEWFAVMENU 0x00000002 // New favorites menu
  321. #define PF_NOBROWSEUI 0x00001000 // don't use browseui
  322. #define PF_FORCEANSI 0x00002000 // Assume that Shell32 is ANSI
  323. // global object array - used for class factory, auto registration, type libraries, oc information
  324. //
  325. #include "cfdefs.h"
  326. #define OIF_ALLOWAGGREGATION 0x0001
  327. #define OIF_DONTIECREATE 0x0002
  328. //
  329. // global variables
  330. //
  331. //
  332. // Function prototypes
  333. //
  334. STDAPI CMyHlinkSrc_CreateInstance(REFCLSID rclsid, DWORD grfContext, REFIID riid, LPVOID* ppvOut);
  335. STDAPI CMyHlinkSrc_OleCreate(CLSID rclsid, REFIID riid, DWORD renderOpt,
  336. FORMATETC* pFormatEtc, IOleClientSite* pclient,
  337. IStorage* pstg, LPVOID* ppvOut);
  338. STDAPI CMyHlinkSrc_OleLoad(IStorage* pstg, REFIID riid, IOleClientSite* pclient, LPVOID* ppvOut);
  339. HRESULT SHRegisterTypeLib(void);
  340. VOID SHCheckRegistry(void);
  341. STDAPI_(IBindCtx *) BCW_Create(IBindCtx* pibc);
  342. STDAPI_(void) DllAddRef(void);
  343. STDAPI_(void) DllRelease(void);
  344. #define MAX_URL_STRING INTERNET_MAX_URL_LENGTH
  345. #define MAX_NAME_STRING INTERNET_MAX_PATH_LENGTH
  346. #define MAX_BROWSER_WINDOW_TITLE 128
  347. #define REG_SUBKEY_FAVORITESA "\\MenuOrder\\Favorites"
  348. #define REG_SUBKEY_FAVORITES TEXT(REG_SUBKEY_FAVORITESA)
  349. //
  350. // Class names
  351. //
  352. #define c_szExploreClass TEXT("ExploreWClass")
  353. #define c_szIExploreClass TEXT("IEFrame")
  354. #ifdef IE3CLASSNAME
  355. #define c_szCabinetClass TEXT("IEFrame")
  356. #else
  357. #define c_szCabinetClass TEXT("CabinetWClass")
  358. #endif
  359. #define c_szAutoSuggestClass TEXT("Auto-Suggest Dropdown")
  360. // Stack allocated BSTR (to avoid calling SysAllocString)
  361. typedef struct _SA_BSTR {
  362. ULONG cb;
  363. WCHAR wsz[MAX_URL_STRING];
  364. } SA_BSTR;
  365. // A "fake" variants for use on the stack - usable for [in] parameters only!!!
  366. typedef struct _SA_BSTRGUID {
  367. UINT cb;
  368. WCHAR wsz[39];
  369. } SA_BSTRGUID;
  370. #define InitFakeBSTR(pSA_BSTR, guid) SHStringFromGUIDW((guid), (pSA_BSTR)->wsz, ARRAYSIZE((pSA_BSTR)->wsz)), (pSA_BSTR)->cb = (38*sizeof(WCHAR))
  371. STDAPI _SetStdLocation(LPTSTR szPath, UINT id);
  372. STDAPI CDocObjectHost_AddPages(LPARAM that, HWND hwnd, HINSTANCE hinst, LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam);
  373. STDAPI_(void) CDocObjectHost_GetCurrentPage(LPARAM that, LPTSTR szBuf, UINT cchMax);
  374. //
  375. // a couple bogus pidls
  376. //
  377. #define PIDL_LOCALHISTORY ((LPCITEMIDLIST)-1)
  378. #define PIDL_NOTHING ((LPCITEMIDLIST)-2)
  379. #define CALLWNDPROC WNDPROC
  380. // Smartly delay load OLEAUT32
  381. HRESULT VariantClearLazy(VARIANTARG *pvarg);
  382. #define VariantClear VariantClearLazy
  383. WINOLEAUTAPI VariantCopyLazy(VARIANTARG * pvargDest, VARIANTARG * pvargSrc);
  384. #define VariantCopy VariantCopyLazy
  385. #ifdef UNICODE
  386. #define StrToOleStrN(wsz, cchWsz, pstr, cchPstr) StrCpyNW(wsz, pstr, cchWsz)
  387. #define IsDBCSLeadByte(x) ((x), FALSE)
  388. #else
  389. #pragma message("need to thunk StrToOleStrN")
  390. #define IsDBCSLeadByte(x) IsDBCSLeadByteEx(CP_ACP,x)
  391. #endif
  392. #define ILIsEqual(p1, p2) IEILIsEqual(p1, p2, FALSE)
  393. #ifdef __cplusplus
  394. //
  395. // C++ modules only
  396. //
  397. #include <shstr.h>
  398. extern "C" const ITEMIDLIST s_idlNULL;
  399. // helper routines for view state stuff
  400. IStream *GetDesktopRegStream(DWORD grfMode, LPCTSTR pszName, LPCTSTR pszStreams);
  401. IStream *GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCTSTR pszName, LPCTSTR pszStreamMRU, LPCTSTR pszStreams);
  402. // StreamHeader Signatures
  403. #define STREAMHEADER_SIG_CADDRESSBAND 0xF432E001
  404. #define STREAMHEADER_SIG_CADDRESSEDITBOX 0x24F92A92
  405. #define CoCreateInstance IECreateInstance
  406. HRESULT IECreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
  407. DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
  408. #endif
  409. extern HRESULT LoadHistoryShellFolder(IUnknown *punkSFHistory, IHistSFPrivate **pphsfHistory); // from urlhist.cpp
  410. extern void CUrlHistory_CleanUp();
  411. #ifdef UNIX
  412. UINT GetCurColorRes(void);
  413. EXTERN_C HRESULT CoCreateInternetExplorer( REFIID iid, DWORD dwClsContext, void **ppvunk );
  414. // Although, UNIX is not exactly right here, because i386
  415. // doesn't require any alignment, but that holds true for
  416. // all the UNIXs we plan IE for.
  417. #define ALIGN4(cb) (((unsigned)(cb) % 4)? (unsigned)(cb)+(4-((unsigned)(cb)%4)) : (unsigned)(cb))
  418. #define ALIGN4_IF_UNIX(cb) ALIGN4(cb)
  419. #else
  420. #define ALIGN4_IF_UNIX(cb)
  421. #endif
  422. // Dummy union macros for code compilation on platforms not
  423. // supporting nameless stuct/union
  424. #ifdef NONAMELESSUNION
  425. #define DUMMYUNION_MEMBER(member) DUMMYUNIONNAME.##member
  426. #define DUMMYUNION2_MEMBER(member) DUMMYUNIONNAME2.##member
  427. #define DUMMYUNION3_MEMBER(member) DUMMYUNIONNAME3.##member
  428. #define DUMMYUNION4_MEMBER(member) DUMMYUNIONNAME4.##member
  429. #define DUMMYUNION5_MEMBER(member) DUMMYUNIONNAME5.##member
  430. #else
  431. #define DUMMYUNION_MEMBER(member) member
  432. #define DUMMYUNION2_MEMBER(member) member
  433. #define DUMMYUNION3_MEMBER(member) member
  434. #define DUMMYUNION4_MEMBER(member) member
  435. #define DUMMYUNION5_MEMBER(member) member
  436. #endif
  437. #undef COMCTL32_VERSION
  438. #define COMCTL32_VERSION 5 // Browseui is stuck with Version 5 comctl32 because it has to run downlevel.
  439. #ifdef __cplusplus
  440. } /* End of extern "C" {. */
  441. #endif /* __cplusplus */
  442. #undef ExpandEnvironmentStrings
  443. #define ExpandEnvironmentStrings #error "Use SHExpandEnvironmentStrings instead"
  444. // Uncomment the following define to enable ATL components to be built in
  445. // browseui.dll. You'll also have to perform the following steps:
  446. // 1. modify the type library in brdispp.idl (Note that this is for private components only)
  447. // 2. modify selfreg.inx to register your components
  448. // 3. copy atl.cpp and atl.h from shdocvw, and modify to return the appropriate classes
  449. // 4. add atl.* to the makefile
  450. // #define ATL_ENABLED
  451. #endif // _PRIV_H_