<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>jeff's WebLog : internet explorer</title><link>http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx</link><description>Tags: internet explorer</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>last post</title><link>http://blogs.msdn.com/jeffdav/archive/2007/05/02/last-post.aspx</link><pubDate>Wed, 02 May 2007 18:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2375866</guid><dc:creator>jeffdav</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/2375866.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=2375866</wfw:commentRss><description>&lt;P&gt;Readers-- I'm leaving MSFT for other opportunities.&amp;nbsp; As such, this will be my last post.&amp;nbsp; Thanks for reading!&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I hope you will all continue to read the IE Team Blog: &lt;A href="http://blogs.msdn.com/ie"&gt;http://blogs.msdn.com/ie&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2375866" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>on CComQIPtr</title><link>http://blogs.msdn.com/jeffdav/archive/2007/04/10/on-ccomqiptr.aspx</link><pubDate>Wed, 11 Apr 2007 01:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2078393</guid><dc:creator>jeffdav</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/2078393.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=2078393</wfw:commentRss><description>&lt;P&gt;You're writing some code that uses COM.&amp;nbsp; Do you use SmartPointers or not use&amp;nbsp;SmartPointers?&amp;nbsp; Debate on this topic flares up now and then.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The trick to answering it is to seperate the technical facts from stubbornly held beliefs.&amp;nbsp; Like any technology, there is a right time and a wrong time to use it.&amp;nbsp; But that's not what I want to talk about today.&amp;nbsp; Let's assume you've decided to use SmartPointers.&amp;nbsp; I posit that CComPtr&amp;lt;&amp;gt; is good and CComQIPtr&amp;lt;&amp;gt; is bad.&lt;/P&gt;
&lt;P&gt;The reason for this is simple: CComQIPtr&amp;lt;&amp;gt; masks the return value of the QueryInterface() call.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Lets take a look at two snippets of code to frame the discussion:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" style="DISPLAY: inline; FONT-SIZE: 1em; BORDER-COLLAPSE: collapse" border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=ms-rtetablecells style="VERTICAL-ALIGN: top" class="ms-rtetablecells"&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;void ExFunc(IFoo *pFoo)&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hr = pFoo-&amp;gt;Init();&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SUCCEEDED(hr))&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New" color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IBar&amp;gt; spBar;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New" color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pfoo-&amp;gt;QueryInterface(IID_PPV_ARGS(spBar));&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New" color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SUCCEEDED(hr))&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = spBar-&amp;gt;DoSomething();&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD class=ms-rtetablecells style="VERTICAL-ALIGN: top" class="ms-rtetablecells"&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;void ExFunc(IFoo *pFoo)&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hr = pFoo-&amp;gt;Init();&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SUCCEEDED(hr))&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = E_NOINTERFACE;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComQIPtr&amp;lt;IBar&amp;gt; spBar = pFoo;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (spBar)&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = spBar-&amp;gt;DoSomething();&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;Some points:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;When you have a large number of people working on the same code base, you want to create patterns in the code that people recognize.&amp;nbsp; CComQIPtr&amp;lt;&amp;gt; breaks the pattern of COM-call/check-HRESULT.&amp;nbsp; Instead you have to check for the non-NULLness of the out parameter.&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;You can assume the QueryInterface() call failed with E_NOINTERFACE, but you don't know for sure.&amp;nbsp; What if it failed with some other HRESULT?&amp;nbsp; Nobody says QueryInterface() can't do things besides just casting this around.&amp;nbsp; E.g. a function that implements IPersistFile::Load() could delay loading the file until someone does a QueryInterface() for an interface that actually needs the contents of the file it was asked to load.&lt;/LI&gt;
&lt;LI&gt;CComQIPtr&amp;lt;&amp;gt; masks errors in QueryInterface().&amp;nbsp; The contract for QueryInterface() is the out parameter must be valid if it returns success, otherwise it must be set to NULL.&amp;nbsp; So, in theory, if (SUCCEEDED(hr)) { ... } and if (spBar) { ... } should be equivalent.&amp;nbsp; However, people often &lt;A class="" href="http://blogs.msdn.com/oldnewthing/archive/2004/03/26/96777.aspx" mce_href="http://blogs.msdn.com/oldnewthing/archive/2004/03/26/96777.aspx"&gt;get QueryInterface() wrong&lt;/A&gt;.&amp;nbsp; It seems to me that it is much more likely an implementer will fail to set the out parameter to NULL on failure than they will fail to return S_OK on success.&lt;/LI&gt;
&lt;LI&gt;Lastly, I just don't like the fact that magic is happening in the assignment.&amp;nbsp; It is easy to screw things up with COM, and it seems CComQIPtr&amp;lt;&amp;gt; just makes it easier.&amp;nbsp; CComPtr&amp;lt;&amp;gt; is a lot less magic and more predictable.&amp;nbsp; It makes it harder to screw things up.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;In summary: use CComPtr&amp;lt;&amp;gt; and don't use CComQIPtr&amp;lt;&amp;gt;.&amp;nbsp;&amp;nbsp;I would especially encourage those who would&amp;nbsp;write Internet Explorer extensions to&amp;nbsp;use CComPtr&amp;lt;&amp;gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Thoughts?&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2078393" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://blogs.msdn.com/jeffdav/archive/tags/COM/default.aspx">COM</category></item><item><title>why doesn't the favicon for my site appear in IE7?</title><link>http://blogs.msdn.com/jeffdav/archive/2007/03/01/why-doesn-t-the-favicon-for-my-site-appear-in-ie7.aspx</link><pubDate>Fri, 02 Mar 2007 00:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1781537</guid><dc:creator>jeffdav</dc:creator><slash:comments>49</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/1781537.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=1781537</wfw:commentRss><description>&lt;P&gt;Today I have a mini-FAQ on Favicons.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: &lt;/STRONG&gt;How do I make a favicon appear for my site in IE7?&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; There are two ways.&amp;nbsp; The first is to put a file in the root of your domain called favicon.ico.&amp;nbsp; The second is to use a &lt;A class="" href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/rel.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/rel.asp"&gt;&amp;lt;link&amp;gt;&lt;/A&gt; tag with the rel="shortcut icon" value and the href value set to the URL for the Icon you wish to display.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt; How often does IE download the favicon?&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; IE will download the icon when a user first visits the site.&amp;nbsp; The icon is stored in the Temporary Internet Files folder on the client machine.&amp;nbsp; Additional metadata about the favicon is stored in the user's Url History database. If either store is cleared, or items relating to the favicon have naturally expired, then the icon will be downloaded again on the next visit.&amp;nbsp; If more than one page (or site) shares the same favicon, it is only downloaded once.&amp;nbsp; IE takes great pains to download the icon as few times as possible to reduce load on the server.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt; I see the wrong favicon for some sites I visit.&amp;nbsp; How do I fix this?&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; If the history database has become corrupted in some way, this can happen.&amp;nbsp; The simplest solution is just to use Delete Browsing History (on the Tools menu) to clear the cache and the history store.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt; I put a favicon.ico on my site as you described, but it still doesn't appear.&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; It must actually be a .ico (an Icon) file.&amp;nbsp; Bitmaps, pngs, gifs, etc, will not work.&amp;nbsp; IE7 will download your favicon to the Temporary Internet Files folder and call &lt;A class="" href="http://msdn2.microsoft.com/en-us/library/ms648068.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms648068.aspx"&gt;ExtractIcon()&lt;/A&gt; on the file.&amp;nbsp; If this fails, we will show the default icon instead of your favicon.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt; I verified that my favicon really is an icon, but it still doesn't appear.&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Since&amp;nbsp;IE loads your icon out of the Temporary Internet Files folder, it must be able to actually store it there.&amp;nbsp; If you are setting the no-cache directive for the icon file, then IE will not be able to display your icon and will display the default icon instead.&amp;nbsp; You can use &lt;A class="" href="http://www.fiddlertool.com/fiddler/" mce_href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/A&gt; to verify.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt; How do I create a different favicon for every page on my site?&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Put a different &lt;A class="" href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/rel.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/rel.asp"&gt;&amp;lt;link&amp;gt;&lt;/A&gt; tag on each page, pointing to a different icon.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: &lt;/STRONG&gt;I changed my site's favicon to a different icon, but the old one still shows in IE.&amp;nbsp; How do I force IE to update?&lt;BR&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; If you just put the favicon.ico file in the root of your domain, IE doesn't have any way of knowing if it changed.&amp;nbsp; To force an update, you need to use a &lt;A class="" href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/rel.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/rel.asp"&gt;&amp;lt;link&amp;gt;&lt;/A&gt; tag and point to a different filename than you previously used.&amp;nbsp; The current filename is compared against the known filename stored in the Url History database.&amp;nbsp; When IE sees the filename has changed, it will download your new icon.&amp;nbsp; Alternatively, you can ask your users to clear their history and cache (Tools-&amp;gt;Internet Options-&amp;gt;Delete Browsing History), which will also force IE to download the new file.&lt;/P&gt;
&lt;P&gt;That should cover most of the questions I've received about favicons in IE7.&amp;nbsp; If you have more questions, feel free to ask.&lt;BR&gt;&lt;BR&gt;&lt;EM&gt;Updated on Monday, 5th March to fix a spelling error and add some additional questions.&lt;/EM&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1781537" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://blogs.msdn.com/jeffdav/archive/tags/favicons/default.aspx">favicons</category></item><item><title>msdn blogging, ie7 and the future</title><link>http://blogs.msdn.com/jeffdav/archive/2007/01/06/msdn-blogging.aspx</link><pubDate>Sun, 07 Jan 2007 01:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1424419</guid><dc:creator>jeffdav</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/1424419.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=1424419</wfw:commentRss><description>&lt;P&gt;My posting rate has declined somewhat since we shipped IE7.&amp;nbsp; It seems posts come in bursts.&amp;nbsp; I have a theory for this.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;At the beginning of a product cycle we are focused on planning, architecting, and implementing.&amp;nbsp; There is not much to talk about, since we can not talk about anything that has not been publicly announced yet.&amp;nbsp; A few posts on context-free problems may trickle out.&lt;/P&gt;
&lt;P&gt;Then we ship a Beta and the bugs start rolling in.&amp;nbsp; This is where things get interesting.&amp;nbsp; Lots of problems to solve translates into having lots of interesting topics to post about.&lt;/P&gt;
&lt;P&gt;Then we lock down for the final release.&amp;nbsp; We focus on fixing the last few compat issues, localizing, branding, and marketing.&amp;nbsp; The devs start dreaming about the next release.&amp;nbsp; Then Thanksgiving and&amp;nbsp;Christmas come a long and we're all taking vacations... Now the new year has started and we are back in the planning phase, which I can't talk about.&lt;/P&gt;
&lt;P&gt;Imagine IE is a ship.&amp;nbsp; We just got back into harbor; we delivered our goods.&amp;nbsp; Some of the crew has moved on; we have taken on some new members.&amp;nbsp; Some are still trickling back in from shore leave.&amp;nbsp; Some of us are focused on fixing damage from the last voyage.&amp;nbsp; Some of us are scrubbing the decks and taking care of day-to-day business.&amp;nbsp; Some are dreaming about our next destination and what the voyage there will look like.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;And from there the metaphore starts to brake down, but I though it was pretty good.&amp;nbsp; I just like big ships.&amp;nbsp; Anyway, we are hard at work.&amp;nbsp; I have a lot of hard thinking and planning to do.&amp;nbsp; I will not be posting until I have something interesting to say; but I have faith that I will, indeed,&amp;nbsp;post again.&amp;nbsp; At the very least I will have to explain the decisions I am about to make when we ship our first Beta :) --&amp;nbsp;in the mean time, there is always the &lt;A class="" href="http://blogs.msdn.com/ie" mce_href="http://blogs.msdn.com/ie"&gt;IE Blog&lt;/A&gt;.&amp;nbsp; (If you're just interested in what I'm doing, feel free to drop in on &lt;A class="" href="http://jeffwine.blogspot.com/" target=_blank mce_href="http://jeffwine.blogspot.com"&gt;this&lt;/A&gt; blog, which has an entirely different focus.)&lt;/P&gt;
&lt;P&gt;I also wanted to do a small summary of IE7, just for some personal closure.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Overall I think IE7 is great.&amp;nbsp; I personally use it at home, which is my bar for everything we build.&amp;nbsp; I have worked on a product (which shall remain nameless) that I did not use at home.&amp;nbsp; Those who know me know my philosophy on installing software: &lt;EM&gt;just don't do it&lt;/EM&gt;.&amp;nbsp; But I have great faith in IE7 and I find myself cursing machines I have to use that have not installed it (&lt;EM&gt;I'm looking at you CS Department...&lt;/EM&gt;).&amp;nbsp; Sure, there are some things that still need work, and I am happy to see us addressing them in our planning for the next version.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In the things-I-worked-on department, I am thrilled that the favicon code I wrote is performing well and web server administrators are not yet calling for my head on a pike.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I think it is great that the Quick Tabs feature has been so well recieved.&amp;nbsp; For those who don't know, QT was originally implemented by two of the most industrious Interns I have worked with, Kevin and Eric.&amp;nbsp; They wrote a lot of code.&amp;nbsp; I mean &lt;EM&gt;a lot&lt;/EM&gt;.&amp;nbsp; They prototyped it (by which I mean they had full working versions, just minus fancy window dressing) in three different technologies.&amp;nbsp; They blew way past the spec and saved a great feature from the cut list.&amp;nbsp; When they left all I had to do was put some drop shadows in, tweak some aspect ratios and fix some performance-related issues (and some other bugs, as which the tester would be sure to mention&amp;nbsp;:P).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I think that tabbed browsing beat everyone's expectations and is, in my opinion, the new gold standard in tabbed browsing UI.&amp;nbsp; It is very usable UI.&amp;nbsp; There were some very tough trade-offs, places where the behavior people expected split fifty-fifty in complete opposites.&amp;nbsp; There were some incredibly challenging app-compat issues to sort out.&amp;nbsp;&amp;nbsp;I use it everyday, and after I changed some options (&lt;STRONG&gt;Tools&lt;/STRONG&gt;-&amp;gt;&lt;STRONG&gt;Internet Options&lt;/STRONG&gt;-&amp;gt;&lt;STRONG&gt;Tabs&lt;/STRONG&gt;-&amp;gt;&lt;STRONG&gt;Settings&lt;/STRONG&gt;) it works pretty much the way I want it to.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I am still not 100% happy with the Delete Browsing History dialog layout, but we made vast improvements, the most important of which was changing it to use the copy engine infrastructure so that the deletion operations no longer happen on the UI thread.&amp;nbsp; About 0.5% (which looks small, but is huge considering the size of the data set) of all IE crashes that were reported to Microsoft were people who had killed the IE process because clearing the cache on the UI thread made them think the process was hung.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;And the features that got cut, well, I think we made the right decisions.&amp;nbsp; May they rise again some day.&amp;nbsp; And I am sure there are some other things I forgot.&lt;/P&gt;
&lt;P&gt;In the mean time, weigh anchor -- full speed ahead!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1424419" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>pop-up blocker and ActiveX controls, part three: creating a user initiated action</title><link>http://blogs.msdn.com/jeffdav/archive/2006/07/20/673203.aspx</link><pubDate>Fri, 21 Jul 2006 01:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:673203</guid><dc:creator>jeffdav</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/673203.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=673203</wfw:commentRss><description>&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; This is part three in a series of posts explaining how ActiveX controls and the IE Pop-up Blocker should interact.&amp;nbsp; The first post is &lt;A href="https://blogs.msdn.com/jeffdav/archive/2006/05/17/600378.aspx"&gt;&lt;FONT color=#fa4520&gt;here&lt;/FONT&gt;&lt;/A&gt;.&amp;nbsp; If you are a user (and not an ActiveX control developer), and have found this post in an attempt to track down why you are still seeing unwanted pop-up windows, please refer to &lt;A href="https://blogs.msdn.com/jeffdav/archive/2006/03/08/546419.aspx"&gt;&lt;FONT color=#fa4520&gt;this&lt;/FONT&gt;&lt;/A&gt; post.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Problem:&lt;/STRONG&gt; You have written an ActiveX control.&amp;nbsp; You have done your due diligence in making sure it does the right thing as described in parts one and two of this series.&amp;nbsp; Now you find a pop-up that should not be blocked is being blocked.&lt;BR&gt;&lt;STRONG&gt;Example:&lt;/STRONG&gt; A real life example happened to me a few days ago;&amp;nbsp; a Microsoft control, in certain circumstances,&amp;nbsp;launches a dialog and then tries to open a new window in response to certain options on that dialog.&amp;nbsp; The user initiated action is long past at that point.&lt;BR&gt;&lt;STRONG&gt;Solution:&lt;/STRONG&gt; When we shipped WindowsXP SP2 we add two new commands&amp;nbsp;to CGID_MSHTML (see mshtmcid.h in the latest SDK).&amp;nbsp; The first is IDM_BEGINUSERACTION and the second is IDM_ENDUSERACTION.&amp;nbsp; They are pretty self-explanitory.&amp;nbsp; Send the first command to tell mshtml a user initiated action is beginning.&amp;nbsp; You will be able to open a new window.&amp;nbsp; Once you have opened your new window, send the second command to tell mshtml that the user action has finished.&lt;/P&gt;
&lt;P&gt;For more info on sending commands to mshtml, see &lt;A href="https://blogs.msdn.com/jeffdav/archive/2006/04/21/581012.aspx"&gt;this&lt;/A&gt; post.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=673203" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>pop-up blocker and ActiveX controls, part two: HlinkSimpleNavigateToMoniker()</title><link>http://blogs.msdn.com/jeffdav/archive/2006/07/20/673194.aspx</link><pubDate>Fri, 21 Jul 2006 01:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:673194</guid><dc:creator>jeffdav</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/673194.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=673194</wfw:commentRss><description>&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: This is part two in a series of posts explaining how ActiveX controls and the IE Pop-up Blocker should interact.&amp;nbsp; The first post is &lt;A href="https://blogs.msdn.com/jeffdav/archive/2006/05/17/600378.aspx"&gt;here&lt;/A&gt;.&amp;nbsp; If you are a user (and not an ActiveX control developer), and have found this post in an attempt to track down why you are still seeing unwanted pop-up windows, please refer to &lt;A href="https://blogs.msdn.com/jeffdav/archive/2006/03/08/546419.aspx"&gt;this&lt;/A&gt; post.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Method:&lt;/STRONG&gt; &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/misc/hlink/reference/functions/hlinksimplenavigatetomoniker.asp"&gt;HlinkSimpleNavigateToMoniker()&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/misc/hlink/reference/functions/hlinksimplenavigatetostring.asp?frame=true"&gt;HlinkSimpleNavigateToString()&lt;/A&gt;.&lt;BR&gt;&lt;STRONG&gt;Mitigation:&lt;/STRONG&gt; I would like to discourage you from calling these functions.&amp;nbsp; They are not, in my opinion,&amp;nbsp;very good functions.&amp;nbsp; If your control must navigate, you should use the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/ifaces/iwebbrowser2/navigate2.asp?frame=true"&gt;IWebBrowser2&lt;/A&gt; function.&amp;nbsp; If you are already calling these functions, and cannot change things, then what you must do is pass the correct pointer in the pUnk parameter.&amp;nbsp; The documentation implies that if pUnk&amp;nbsp;is NULL and you are an ActiveX control then your navigation will not succeed.&amp;nbsp; This is not the case--the function has no good way to even tell if you are an ActiveX control or not.&amp;nbsp; You identify yourself as one or the other by passing or not passing a non-NULL value.&amp;nbsp; If you pass NULL, then the pop-up blocker will not get involved.&amp;nbsp; If, however, you pass a non-NULL value, you have identified yourself as an ActiveX control and pop-up blocking will be in effect.&amp;nbsp; You should not lie to this function.&lt;BR&gt;&lt;BR&gt;The documentation is also not very clear on what, exactally, you should pass in the pUnk parameter or what it is used for.&amp;nbsp; Your control is being hosted by mshtml.&amp;nbsp; You should pass a pointer to your client site, which is the object in mshtml hosting you.&amp;nbsp; The HlinkSimpleNavigate functions will attempt to query this object for various interfaces related to pop-up blocking if your call is going to result in a new window.&amp;nbsp; If they fail, your new window will be blocked and the HlinkSimpleNavigate function will return E_ACCESSDENIED.&amp;nbsp; For more information about client site pointers, see &lt;A href="https://blogs.msdn.com/jeffdav/archive/2006/03/28/563210.aspx"&gt;this&lt;/A&gt; post.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Additionally the function will attempt to get pointers to various webbrowser interfaces to perform the navigation (whether it is a new window or not).&amp;nbsp; If this fails (because you passed NULL) a new browser process will be created and navigated.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=673194" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>pop-up blocker and ActiveX controls, part one: IWebBrowser::Navigate(), IWebBrowser::Navigate2()</title><link>http://blogs.msdn.com/jeffdav/archive/2006/05/17/600378.aspx</link><pubDate>Thu, 18 May 2006 00:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:600378</guid><dc:creator>jeffdav</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/600378.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=600378</wfw:commentRss><description>&lt;P&gt;As I mentioned &lt;A HREF="/jeffdav/archive/2006/03/08/546419.aspx"&gt;previously&lt;/A&gt;, one reason users may continue to experience unwanted pop-up windows while browsing is creative use of ActiveX controls that provide methods that allow web sites to open new browser windows.&amp;nbsp; This series of posts will provide best-practices for ActiveX control implementors.&lt;/P&gt;
&lt;P&gt;There are two things to keep in mind while considering this topic.&amp;nbsp; The first is, as always, we are committed to application and site compatibility and thus a lot of the pop-up blocker is opt-in and in the abscence of concrete knowledge that a pop-up is unwanted, our default is often to allow the pop-up.&amp;nbsp; The second thing is there are an incredible number of ways to navigate IE, so this will, necessarily, be part one in&amp;nbsp;a survey of this multitude.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;If you are a user (and not an ActiveX control developer), and have found this post in an attempt to track down why you are still seeing unwanted pop-up windows, please refer to &lt;A HREF="/jeffdav/archive/2006/03/08/546419.aspx"&gt;this&lt;/A&gt; post.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Method: &lt;/STRONG&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/ifaces/iwebbrowser2/navigate.asp?frame=true"&gt;IWebBrowser::Navigate()&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/ifaces/iwebbrowser2/navigate2.asp?frame=true"&gt;IWebBrowser2::Navigate2()&lt;/A&gt;&lt;BR&gt;&lt;STRONG&gt;Mitigation:&lt;/STRONG&gt; Each of these methods takes a set of &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/enums/browsernavconstants.asp"&gt;BrowserNavConstants&lt;/A&gt;&amp;nbsp;in the&amp;nbsp;Flags parameter.&amp;nbsp; Controls (and applications) should pass navNewWindowsManaged if they desire pop-up blocker to be applied.&amp;nbsp; Clues that you want&amp;nbsp;this flag&amp;nbsp;would be such things as you are also passing navOpenInNewWindow or are targeting a frame name via the TargetFrameName parameter and that frame may not exist--in which case a new browser window may be created with that name.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=600378" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://blogs.msdn.com/jeffdav/archive/tags/code/default.aspx">code</category></item><item><title>IOleCommandTarget, CGID_MSHTML and ActiveX controls</title><link>http://blogs.msdn.com/jeffdav/archive/2006/04/21/581012.aspx</link><pubDate>Sat, 22 Apr 2006 00:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:581012</guid><dc:creator>jeffdav</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/581012.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=581012</wfw:commentRss><description>&lt;P&gt;If you write an application that hosts the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/browser_control_node_entry.asp"&gt;WebBrowser Control&lt;/A&gt;, and you want the control to do something, you can send &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/commandids.asp"&gt;commands&lt;/A&gt; to mshtml via the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/5c8b455e-7740-4f71-aef6-27390a11a1a3.asp?frame=true"&gt;IOleCommandTarget&lt;/A&gt; interface.&lt;/P&gt;
&lt;P&gt;However, if you are an ActiveX control and you want to send &lt;STRONG&gt;CGID_MSHTML&lt;/STRONG&gt; commands, you may try something like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IOleCommandTarget *pCommandTarget = NULL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = _punkSite-&amp;gt;QueryInterface(IID_IOleCommandTarget, (void **)&amp;amp;pCommandTarget);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SUCCEEDED(hr))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr&amp;nbsp;= pCommandTarget-&amp;gt;Exec(&amp;amp;CGID_MSHTML, IDM_FOO, 0, NULL, NULL);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCommandTarget-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;If you have tried this, you will see that it fails for &lt;STRONG&gt;CGID_MSHTML&lt;/STRONG&gt; commands.&amp;nbsp; It fails because your control is hosted by an object inside of mshtml.dll that delegates&amp;nbsp;all incoming commands&amp;nbsp;to the nearest &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/reference/ifaces/idochostuihandler/idochostuihandler.asp"&gt;DocHostUIHandler&lt;/A&gt;.&amp;nbsp; For IE, that is implemented by an object in shdocvw.dll (or ieframe.dll for IE7+).&amp;nbsp; That object does not recognize &lt;STRONG&gt;CGID_MSHTML&lt;/STRONG&gt; commands.&lt;/P&gt;
&lt;P&gt;In order for your call to be routed correctly, you need to get an object "above" the object that is hosting your control.&amp;nbsp; To do this, you can first ask the client site for an &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/components/com/reference/ifaces/iserviceprovider/iserviceprovider.asp?frame=true"&gt;IServiceProvider&lt;/A&gt;:&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IServiceProvider *pServiceProvider = NULL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = _punkSite-&amp;gt;QueryInterface(IID_IServiceProvider, (void **)&amp;amp;pServiceProvider);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SUCCEEDED(hr))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IOleCommandTarget *pCommandTarget = NULL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pServiceProvider-&amp;gt;QueryService(&lt;FONT color=#000000&gt;SID_SContainerDispatch, IID_IOleCommandTarget, &amp;amp;pCommandTarget);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SUCCEEDED(hr))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pCommandTarget-&amp;gt;Exec(&amp;amp;CGID_MSHTML, IDM_FOO, 0, NULL, NULL);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pCommandTarget-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pServiceProvider-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Times New Roman" size=3&gt;By asking for the ContainerDispatch's command target, you get the correct target for MSHTML commands.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=581012" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://blogs.msdn.com/jeffdav/archive/tags/code/default.aspx">code</category></item><item><title>on getting IOleCommandTarget wrong (and a bit in the middle about ActiveX controls)</title><link>http://blogs.msdn.com/jeffdav/archive/2006/04/11/573776.aspx</link><pubDate>Tue, 11 Apr 2006 21:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:573776</guid><dc:creator>jeffdav</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/573776.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=573776</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/5c8b455e-7740-4f71-aef6-27390a11a1a3.asp"&gt;IOleCommandTarget&lt;/A&gt; is very useful.&amp;nbsp; It provides a generic way of sending commands between objects.&amp;nbsp; IE makes extensive use of &lt;STRONG&gt;IOleCommandTarget&lt;/STRONG&gt;, both publically and internally.&amp;nbsp; And, like &lt;A HREF="/oldnewthing/archive/2004/03/26/96777.aspx"&gt;IUnknown&lt;/A&gt;, people frequently get it wrong.&lt;/P&gt;
&lt;P&gt;Each command is composed of a &lt;STRONG&gt;GUID&lt;/STRONG&gt; (Command Group Identifier) and&amp;nbsp;a &lt;STRONG&gt;DWORD&lt;/STRONG&gt;&amp;nbsp;(Command Identifier).&amp;nbsp; &lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;First, what is wrong with this code:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;HRESULT CFoo::Exec(&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt; GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut)&lt;BR&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/FONT&gt; (IsEqualGUID(CGID_FooCommands, *pguidCmdGroup))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The answer is obvious: &lt;STRONG&gt;pguidCmdGroup&lt;/STRONG&gt; might be NULL and you crash.&amp;nbsp; Furthermore, &lt;STRONG&gt;pguidCmdGroup&lt;/STRONG&gt; is frequently NULL, since NULL is how you specify the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/ae1592b6-2afd-4379-a18e-d46b226bc9e2.asp?frame=true"&gt;standard group&lt;/A&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;You might say to yourself, "Self, I don't need to worry about NULL, since I am the only consumer of this particular implementation,"&amp;nbsp; and that may be the case.&amp;nbsp; However, if you can be CoCreate()'ed, than it is definitively not the case.&amp;nbsp; Remember, &lt;A HREF="/jeffdav/archive/2006/03/08/546419.aspx"&gt;any control on your machine can be instantiated as an ActiveX control&lt;/A&gt;.&amp;nbsp; During the ActiveX control instantiation process, mshtml will query your object for certain well-known interfaces, like &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/components/com/reference/ifaces/iobjectsafety/iobjectsafety.asp"&gt;IObjectSafety&lt;/A&gt;, &lt;A HREF="/jeffdav/archive/2006/03/28/563210.aspx"&gt;IOleObject&lt;/A&gt;, and, you guessed it, &lt;STRONG&gt;IOleCommandTarget&lt;/STRONG&gt;.&amp;nbsp; If your control responds to &lt;STRONG&gt;IOleCommandTarget&lt;/STRONG&gt;, mshtml will attempt to &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/a2071ca9-8675-4f53-b30e-8c7198c2acca.asp?frame=true"&gt;Exec&lt;/A&gt;() standard commands.&amp;nbsp; If you do not guard for NULL, you will cause Internet Explorer (and other hosts) to crash.&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;The second set of common errors come in the form of returning incorrect error codes.&amp;nbsp; The documentation outlines the rules and you must be careful to implement them.&amp;nbsp; If you recognize the group but not the command, &lt;STRONG&gt;OLECMDERR_E_NOTSUPPORTED&lt;/STRONG&gt; is the correct return value.&amp;nbsp; If you do not recognize the group, &lt;STRONG&gt;OLECMDERR_E_UNKNOWNGROUP&lt;/STRONG&gt; is correct.&amp;nbsp; There is a special case though, which is when the group is NULL and the command is not supported; in this case the correct return value is &lt;STRONG&gt;OLECMDERR_E_NOTSUPPORTED&lt;/STRONG&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=573776" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://blogs.msdn.com/jeffdav/archive/tags/code/default.aspx">code</category></item><item><title>on IObjectWithSite, IOleObject and ActiveX controls</title><link>http://blogs.msdn.com/jeffdav/archive/2006/03/28/563210.aspx</link><pubDate>Tue, 28 Mar 2006 19:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:563210</guid><dc:creator>jeffdav</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/563210.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=563210</wfw:commentRss><description>&lt;P&gt;ActiveX® controls frequently need to communicate with their containing object.&amp;nbsp; For example, a control may want to &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/components/com/reference/ifaces/iserviceprovider/iserviceprovider.asp?frame=true"&gt;QueryService&lt;/A&gt; for the cached &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mobilesdk5/html/mob5lrfiinternetsecuritymanager.asp?frame=true"&gt;InternetSecurityManager&lt;/A&gt; object to &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/security/szone/reference/ifaces/iinternetsecuritymanager/processurlaction.asp?frame=true"&gt;decide&lt;/A&gt; whether or not to take a particular &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/security/szone/reference/constants/urlaction.asp?frame=true"&gt;action&lt;/A&gt;.&amp;nbsp; Controls can obtain a pointer to their containing object (also called the object's &lt;EM&gt;site&lt;/EM&gt;) in one of at least two ways.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The typical scenario is Internet Explorer hosts the ActiveX® control inside of an object implemented in mshtml.dll.&amp;nbsp; Controls that need to communicate with their container implement &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/ef12a4ef-f682-4469-b7b8-3110ce9ce873.asp?frame=true"&gt;IOleObject&lt;/A&gt;&amp;nbsp;and mshtml will call the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/6690b5a3-bada-496c-89cb-a9ae1fc9dfb0.asp?frame=true"&gt;SetClientSite&lt;/A&gt; method with a pointer to itself.&amp;nbsp; Communication can now proceed by querying the given &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/dafee149-926a-4d08-a43d-5847682db645.asp?frame=true"&gt;IOleClientSite&lt;/A&gt; pointer.&lt;/P&gt;
&lt;P&gt;However, there is another scenario that authors of ActiveX® controls must consider.&amp;nbsp; Controls can be dynamically created through script, e.g.:&lt;/P&gt;&lt;TT&gt;
&lt;P&gt;&amp;lt;script&amp;gt;&lt;BR&gt;oAX = new ActiveXObject('MyControl');&lt;BR&gt;&amp;lt;/script&amp;gt;&lt;/P&gt;&lt;/TT&gt;
&lt;P&gt;In this case, the control is now being instantiated not by mshtml.dll, but by jscript.dll.&amp;nbsp; Since jscript.dll does not implement any OLE containers, it does not set a client site pointer via &lt;STRONG&gt;IOleObject&lt;/STRONG&gt;.&amp;nbsp; It does, however, maintain an &lt;STRONG&gt;IServiceProvider&lt;/STRONG&gt; chain to mshtml that can be accessed by an ActiveX® control.&amp;nbsp; The control must implement &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/components/com/reference/ifaces/iobjectwithsite/iobjectwithsite.asp?frame=true"&gt;IObjectWithSite&lt;/A&gt;.&amp;nbsp; Now jscript will be able to call &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/workshop/components/com/reference/ifaces/iobjectwithsite/setsite.asp"&gt;SetSite&lt;/A&gt; and the control can query the &lt;STRONG&gt;IUnknown&lt;/STRONG&gt; pointer for services it requires from its container.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Astute readers may, at this point, notice something funny in the documentation.&amp;nbsp; &lt;STRONG&gt;IObjectWithSite&lt;/STRONG&gt;'s documentation says, without elaboration:&amp;nbsp; "This interface should only be used when &lt;B&gt;IOleObject&lt;/B&gt; is not already in use."&amp;nbsp; This has to be read carefully.&amp;nbsp; Notice the documentation uses the words "...in use," not "...implemented."&amp;nbsp;&amp;nbsp;You should keep track of the two different site pointers and prefer the one obtained from&amp;nbsp;&lt;STRONG&gt;IOleObject&lt;/STRONG&gt;.&amp;nbsp;If, however, you find that site is NULL then &lt;STRONG&gt;IOleObject&lt;/STRONG&gt; is not being used and&amp;nbsp;it is acceptable to fallback to using the site obtained from &lt;STRONG&gt;IObjectWithSite&lt;/STRONG&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=563210" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://blogs.msdn.com/jeffdav/archive/tags/code/default.aspx">code</category></item><item><title>Debugging and the C++ Renaming Problem</title><link>http://blogs.msdn.com/jeffdav/archive/2005/04/18/409300.aspx</link><pubDate>Mon, 18 Apr 2005 21:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:409300</guid><dc:creator>jeffdav</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/409300.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=409300</wfw:commentRss><description>&lt;P&gt;(Today we have&amp;nbsp;another installment of Jeff's Real Microsoft Debugging Stories.)&lt;/P&gt;
&lt;P&gt;Recently a minor piece of an IE&amp;nbsp;feature I own stopped working in our latest internal builds, so I debugged it.&amp;nbsp; Issues where something that has worked for a long time and suddenly stopped working are always a special kind of fun, especially when I have never touched the code.&amp;nbsp; The problem was subtle--when I stepped through the code everything appeared to suceed, yet it still did not work.&amp;nbsp; Finally I went line by line comparing the execution path in our alpha code to what we shipped in Windows XP Service Pack 2.&amp;nbsp; For a long time, everything was the same, until I stepped into a call to IConnectionPoint::Advise()&amp;nbsp;and ended up in two different functions on the two different machines.&amp;nbsp; What happened, as &lt;a href="http://blogs.msdn.com/oldnewthing"&gt;Raymond&lt;/A&gt; later pointed out, was we had encountered the Renaming Problem, defined in &lt;A href="http://www.amazon.com/exec/obidos/tg/detail/-/0201514591/qid=1113844893/sr=8-2/ref=pd_csp_2/104-3455254-2067955?v=glance&amp;amp;s=books&amp;amp;n=507846"&gt;The Annotated C++ Reference Manual&lt;/A&gt;, section 10.11c.&amp;nbsp; Consider:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Class CFoo : CConnectionPointImpl&amp;lt;...goo...&amp;gt;,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ISomeNewInterface,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;The issue here was one of our classes inherited from a base class that did the dirty work of setting up the connection point.&amp;nbsp; Then, for the next version of the product, someone added another interface (ISomeNewInterface) to CFoo and implemented all the necessary functions.&amp;nbsp; Unfortunately, the new interface also had a method called Advise() that had the exact same footprint as IConnectionPoint's Advise() function.&amp;nbsp; Thus the new implementation was overriding the old implementation.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;So, the question is, what do we do about it?&amp;nbsp;&amp;nbsp; Of course there are several immediate solutions.&amp;nbsp; Stroustrup's book gives an example where you have a class that inherits from two different base classes that happen to have a naming collision. He suggests implementing two wrapper classes for the two base classes with different method names that forward to their base class implementation appropriately.&amp;nbsp; In my opinion this is a bit ugly.&amp;nbsp; The easiest solution is to change the name of the method on the new interface, since we have not shipped it yet.&amp;nbsp; I also found that explicitly declaring the new Advise() as being a member of the new interface and not IConnectionPoint in the header file worked, i.e.:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ISomeNewInterface&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;HRESULT ISomeNewInterface::Advise(IUnknown *, DWORD *);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;HRESULT SomeOtherMethod();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;BR&gt;&lt;BR&gt;However, I have not been able to find one way or the other if this is standard and&amp;nbsp;legal C++ syntax or if I am getting lucky with this compiler.&amp;nbsp; Thoughts?&lt;/P&gt;
&lt;P&gt;Edit: The MSDN team informs me they are actively tracking a bug that the IConnectionPoint documentation does not work.&lt;/P&gt;
&lt;P&gt;(Thank you for joining us.&amp;nbsp; Tune in next week when we talk more about how History works.)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=409300" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>Index.dat Part IV - It's doing what on the UI thread?</title><link>http://blogs.msdn.com/jeffdav/archive/2004/12/02/273890.aspx</link><pubDate>Thu, 02 Dec 2004 19:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:273890</guid><dc:creator>jeffdav</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/273890.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=273890</wfw:commentRss><description>&lt;p&gt;Whenever someone kills an application because it is hung we get a little report with the stack and some other information (if the user chooses to send it).&amp;nbsp; About 1% of the reports&amp;nbsp;for IE are from users who have killed IE (or the Internet Control Panel) while it was clearing the cache.&amp;nbsp; This is only slightly related to index.dat; I am using this series of postings as an excuse to talk about it on the assumption that someone might find it interesting.&lt;/p&gt; &lt;p&gt;In IE, Tools-&amp;gt;Internet Options-&amp;gt;Delete Files...-&amp;gt;OK.&amp;nbsp; Depending on how big you have set your cache and how long it has been since it was last cleared, this little operation can take a long time.&amp;nbsp; I have personally seen it take as long as 20 minutes, which is a long time to stare at the little hourglass cursor.&amp;nbsp; Of course the Internet Control Panel dialog is modal to the IE window, which means you cannot get back to whatever you were doing in the IE window until it is done.&amp;nbsp; And if you click on things like the title bar, etc, as most people do when some program is taking an infuriating amount of time to accomplish something, Windows appends the [not responding] text to the title text.&amp;nbsp; So people kill it.&lt;/p&gt; &lt;p&gt;The moral of this story is known to us in advance, I think: do not do blocking stuff on the UI thread.&amp;nbsp; &lt;/p&gt; &lt;p&gt;It is an interesting problem though.&amp;nbsp; The solution is not as straight-forward as one may initially think.&amp;nbsp; The obvious thing to do is to spin up a background thread and have the cache-clearing done on the new thread.&amp;nbsp; Assume that has been done; you open IE, clear the cache, the thread kicks off, you close the inetcpl, you close IE, you shutdown your computer.&amp;nbsp; Did the cache get cleared?&amp;nbsp; You asked for it to be cleared but you do not know for sure.&amp;nbsp; What if it was still going 20 minutes later when you shutdown your machine?&amp;nbsp; There are privacy implications here--I want to know when it has finished.&amp;nbsp; &lt;/p&gt; &lt;p&gt;A proper solution would implement some sort of feedback, like file copy operations or the file download dialog in IE, that can live in a non-modal state even if the parent IE window has closed.&amp;nbsp; Which is probably why nobody fixed it in previous releases--bigger fish to fry.&amp;nbsp; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=273890" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>Index.dat Part III - How do I delete index.dat?</title><link>http://blogs.msdn.com/jeffdav/archive/2004/11/19/266977.aspx</link><pubDate>Fri, 19 Nov 2004 21:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:266977</guid><dc:creator>jeffdav</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/266977.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=266977</wfw:commentRss><description>&lt;p&gt;These data files are used by Internet Explorer and Windows Explorer.&amp;nbsp; You cannot delete a file that is in use by a running program.&amp;nbsp; If you feel you need to delete the file, you will have to shutdown all instances of Explorer and IE.&amp;nbsp; This includes applications that may host the Webbrowser control: Outlook, Messenger, IE, Product Studio, Visual Studio, Help, Windows Media Player, etc.&amp;nbsp; Your best bet is just close everything.&amp;nbsp; When you are left with a desktop and a start menu, you will still need to shutdown Explorer.&amp;nbsp; To cleanly shutdown Explorer: Start-&amp;gt;Shutdown-&amp;gt;&lt;strong&gt;CTRL&lt;/strong&gt;+&lt;strong&gt;ALT&lt;/strong&gt;+&lt;strong&gt;SHIFT&lt;/strong&gt;+Click 'Cancel' (for more info, see &lt;A href="http://blogs.msdn.com/jeffdav/archive/2004/07/22/191636.aspx"&gt;this post&lt;/a&gt;).&amp;nbsp; You can use Task Manager (&lt;strong&gt;CTRL&lt;/strong&gt;+&lt;strong&gt;SHIFT&lt;/strong&gt;+&lt;strong&gt;ESC&lt;/strong&gt;,&lt;strong&gt; &lt;/strong&gt;File-&amp;gt;Run...) at this point to open a command window.&amp;nbsp; You should be able to go delete the index.dat.&amp;nbsp; I have only tried this on XPSP2, but it should work&amp;nbsp;anywhere.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=266977" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>Index.dat: Part II - What are they used for?</title><link>http://blogs.msdn.com/jeffdav/archive/2004/11/18/266045.aspx</link><pubDate>Fri, 19 Nov 2004 00:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:266045</guid><dc:creator>jeffdav</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/266045.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=266045</wfw:commentRss><description>&lt;p&gt;As I mentioned in &lt;A href="http://blogs.msdn.com/jeffdav/archive/2004/11/18/266027.aspx"&gt;Part I&lt;/a&gt;, index.dat files are used by various features of IE to keep track of URLs and associated information about URLs.&amp;nbsp; The two primary consumers of these files are the Temporary Internet Files folder (TIF) and History.&amp;nbsp; &lt;/p&gt; &lt;p&gt;TIF uses an index.dat file to map URLs to the associated Cache file name.&amp;nbsp; Developers can use the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/geturlcacheentryinfoex.asp"&gt;GetUrlCacheEntryInfoEx()&lt;/a&gt; function to perform this lookup.&amp;nbsp; &lt;/p&gt; &lt;p&gt;History, which I am more familiar with, uses an index.dat file to keep track of which URLs should be displayed in History.&amp;nbsp; Additionally, it stores other metadata about the url, such as the number of visits.&amp;nbsp; This information is consumed by many features of IE.&amp;nbsp; Off-line favorites uses it to keep track of subscription information.&amp;nbsp; Shortcuts use it to find the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/workshop/Author/dhtml/howto/ShortcutIcon.asp"&gt;Favicon&lt;/a&gt;.&amp;nbsp; Auto-complete uses it to create a list of options to display in the drop-down box.&amp;nbsp; Link coloring in the HTML rendering engine uses the list to decide how to color any given link on the page.&lt;/p&gt; &lt;p&gt;Furthermore, History actually uses more then one index.dat file.&amp;nbsp; If you look in the [user profile]\Local Settings\History\History.IE5\ directory, you will see index.dat and some directories of the form MSHist###################.&amp;nbsp; Those directories also contain index.dat files.&amp;nbsp; The root-most index.dat file is where general history information is stored.&amp;nbsp; The ones in the MSHist directories are used to support alternate views of History.&amp;nbsp; If you open the History Explorer Bar (&lt;strong&gt;CTRL&lt;/strong&gt;+&lt;strong&gt;H&lt;/strong&gt;) and click the View drop down (&lt;strong&gt;ALT&lt;/strong&gt;+&lt;strong&gt;W&lt;/strong&gt;) you will see the various views that IE supports.&amp;nbsp; &lt;/p&gt; &lt;p&gt;More to follow.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=266045" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item><item><title>Index.dat: Part I - What is index.dat?</title><link>http://blogs.msdn.com/jeffdav/archive/2004/11/18/266027.aspx</link><pubDate>Thu, 18 Nov 2004 23:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:266027</guid><dc:creator>jeffdav</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/jeffdav/comments/266027.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffdav/commentrss.aspx?PostID=266027</wfw:commentRss><description>&lt;p&gt;If you go poking around in [d]:\Documents and Settings\[user name]\Local Settings\History\, for example,&amp;nbsp;you will find several index.dat files laying around.&amp;nbsp; (Note: several of the directories that I listed in the path are hidden directories.)&amp;nbsp; &lt;/p&gt; &lt;p&gt;We (the IE team) get a lot of questions about these files.&amp;nbsp; The first question is often "What are they?" The answer is quite simple: Index.dat files are binary files that Internet Explorer uses to save information about&amp;nbsp;URLs.&amp;nbsp;&amp;nbsp;They are basically hash tables that have been optimized to&amp;nbsp;be&amp;nbsp;very fast when dealing with URLs.&amp;nbsp;&amp;nbsp;Given an URL, these files map the&amp;nbsp;URL to a binary blob of data.&amp;nbsp; The binary blob of data is different, depending on what the particular&amp;nbsp;index.dat file is used for.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Index.dat files are for IE's internal usage only.&amp;nbsp; They are not designed or tested to be used by others.&amp;nbsp; The functions for interacting with them are private, except things like the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/geturlcacheentryinfoex.asp"&gt;UrlCache APIs&lt;/a&gt; which provide a layer of abstraction for interacting with some index.dat files.&lt;/p&gt; &lt;p&gt;More on this topic to follow.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=266027" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffdav/archive/tags/internet+explorer/default.aspx">internet explorer</category></item></channel></rss>