Saturday, June 21, 2008

the internet explorer object cookbook

When you start writing Internet Explorer extensions, or dealing with the DOM and the Webbrowser control at all, you frequently find you have an object of type X and you need to get the corresponding object of type Y. There is a lot of myth and bad advice on the web surrounding how to do some of these things.

The "site" in all of the following refer to the IUnknown you are given by Internet Explorer when it calls your IObjectWithSite::SetSite() method.

IWebBrowser2 from site

1. QueryInterface() your site for IID_IServiceProvider.
2. QueryService() the IServiceProvider for SID_STopLevelBrowser, IID_IServiceProvider.
3. QueryService() the top level IServiceProvider for SID_SWebBrowserApp, IID_IWebBrowser2.

IHTMLDocument2 from IWebBrowser2

1. Call IWebBrowser2::get_Document().
2. QueryInterface() the resulting IDispatch pointer for IID_IHTMLDocument2.

IHTMLDocument2 from site

1. Follow steps for "IWebBrowser2 from site" above.
2. Follow steps for "IHTMLDocument2 from IWebBrowser2" above.

IWebBrowser2 from IHTMLDocument2

1. QueryInterface() the IHTMLDocument2 for IID_IServiceProvider.
2. QueryService() the IServiceProvider for SID_SWebBrowserApp, IID_IWebBrowser2.

IHTMLDocument2 from IHTMLElement

1. Call IHTMLElement::get_Document();
2. QueryInterface() the resulting IDispatch pointer for IID_IHTMLDocument2.

IHTMLDocument2 from HWND

1. Use the accessibility hack described at here.

Monday, June 2, 2008

the freedom to choose includes the freedom to choose poorly

No, I am not going to talk about democrotics and our current and upcoming elected officials. I am going to talk about the consumer computer eco-system.

When I was doing IT consulting work during collage, there were a few major players in the PC world: Dell, HP, Compaq and Gateway. They all had their ups and downs with their products. Usually one would be good while the other was making boxes with problems, but then it would switch. Our job was to keep up on who was making good boxes at the time and sell them to our customers. However, we all knew the best machines were machines you built yourself. And we enjoyed building them. So when friends and family would ask me what computer they should buy, I would mention who I though was making a good model, but I would also offer to build them one that was better for cheaper.

When I worked at MSFT, we all had Dell workstations. I would say about 90% of all Windows development took place on Dell machines with Intel Processors. So when friends and family would ask for a computer recommendation, I would point them at Dell. Of course, I no longer had time to build them a machine, though I still built my own from scratch.

Now that I work on PicLens, I have to write code that supports Firefox, Internet Explorer and Safari on both Mac and Windows. We have subsystems that run on top of OpenGL, DirectX, and a software rendered that works in two different modes, depending on which we detect would give better support on a specific system.

Yet we still get a fair number of people who send in e-mail with reports of graphics issues. Some are minor glitches, some are major glitches that make the product unusable. A very small number are blue screens. We take all customer feedback seriously and follow up with them asking about their configuration, etc. Almost all of them have one thing in common: non-premium graphics cards, by which I mean a card that is not a high end ATI or NVidia card.

I am coming to the part where I get to the point.

These days, when friends and family ask me what computer they should get, I think I will start telling them to get a Mac.

Let me be clear, I still hate Macs. With a passion. I have to use one at work, and I remain unconverted. But what they do is take away the freedom to choose poorly.

Let me explain:

With a PC, you never know what you are going to get. And even people who build there own machines often make decisions based on price point, not quality. Not to mention people who build their own machines but do not really understand how hardware and software drivers work.

With a Mac, you always get good hardware. They all have Intel processors. They all have NVidia or ATI graphics cards, with drivers that are known to work. Sure, Microsoft can certify drivers, but they can not test them in every possible configuration of PC hardware. But Apple can test every configuration. Because they only have tens of possibilities instead of thousands.

Nothing has really changed since I was in IT consulting. The trade-offs are still the same: build your own, buy an OEM and roll the dice, or pay a bunch more for a Mac that you can only do so much with but at least it will work. All that has changed is my point of view.

As an idealistic youth, I wanted everyone to get the most from their computing experience. I wanted to educate them about the machines and the software. At Microsoft I just wanted them to leave me alone and figure it out for themselves. Now I just can not be bothered by it at all. Macs work. They stop you from shooting yourself in the foot. And hey, if people think it makes them look cool, then even better.

I will still be building my own machines. My house is all Asus all the time. It is amazing, but I have never had any problems with Asus video cards in Asus mother boards. I prefer NVidia (though it is not a logical or rational preference). I only buy Intel Processors(but that is a completely separate discussion) and Seagate hard drives (though I will accept Western Digital and I really wish there was a quality third player).

Everyone else should get a Mac. It makes my life easier in the short term, since I do not have to do any support. Though, I guess if everyone got a Mac I would have to do ALL my development on a Mac. And I would miss Visual Studio and NTSD.

So, I guess the moral of the story is when choosing a video card, choose wisely. Caveat emptor and all that. Or, spend more than $20 on a video card.

See also: Wired: Graphics Chips Gun for Supremacy in Silicon Showdown

Saturday, May 31, 2008

the TIF really is a cache -- and it acts like one

It seems obvious, but I guess it has to be said. Internet Explorer's Temporary Internet Files folder is a cache. From Wikipedia: a cache is a temporary storage area where frequently accessed data can be stored for rapid access. Please note the use of the word temporary. This means that the data you want may not actually be there.

I frequently see questions along the lines of "How can I find this image/page in the cache?" or, even better, "How come this page I viewed isn't in the cache?" I love it when the askers of the latter form imply that this is a bug.

Files in the cache can be deleted at anytime. You can be looking at a page and then go to the cache and find it isn't there. There are many scenarios where this is legitimate. For example, if, while you are viewing this page, you go to Tools->Delete Browsing History and then clear your Temporary Internet Files, the only representation that IE will have of this page and all of its elements is the one in memory. Close the browser and that memory is freed and now its gone until you download it from the webserver again.

The page you are viewing may use the no-cache http header. The cache manager may have decided its time to scavenge. There may have even been an error writing to the cache and the cache has become corrupt.

I am sure there are other scenarios as well. The point is, you cannot rely on data to always be there. You must either capture the data in some other way, or be prepared to make a request to the server.

Thursday, May 29, 2008

to help or not to help

More and more I am confronted with a sort of moral dilemma. I read and post to the IE development forums over at MSDN. Frequently I see posts like this:

i want a BHO which continuously observe IE activity and send the URLs visited and time of visit and time of outfocus of them as soon as they are available,to listening java servlet. Now Please suggest me how to do this,perticularly this sending of url and their time details to java servlet.


He does not ask for help with a specific problem or bug he has encountered in the process. He does not tell us what he has done or post a sample of code he can not get to work. He simply asks, "how do I do this?" His masterful command of English does not help his case.

This guy is probably up to no good.

I can only think of one semi-legit use for such a thing, which would be for employers or parents to spy on their employees or children. And I'm not sure I can even get behind that.

So my dilemma becomes, do I help this guy? Do I tell him what to do? On the one hand, I do not want to be enabling spyware makers in anyway. On the other hand, if someone is paying him to do this thing, he is going to write the program whether I help him or not. Given that, is it better to make sure he does it right? I mean, which is better, crashing spyware or non-crashing spyware?

Anyway, today I am not helping this guy.

Tuesday, April 15, 2008

PicLens 1.6.3 Released

We released 1.6.3 yesterday to piclens.com. Why the change from 1.6.2 to 1.6.3? Because we now support video in the Wall.



You can search YouTube and watch the videos right in the wall. During development we spent a lot of time watching videos... it can be very addictive.

Thursday, March 20, 2008

I can't stand it anymore, I have to say it

I love my iPhone.

There, I said it. I feel dirty.

My Windows-based SmartPhone got crushed in an under-the-motorized-car-seat retrieval operation that went horribly awry. Faced with a rapidly diminishing usable space on the cracked LCD screen, I went to the AT&T store to get the new hotness.

I suspected I wanted an iPhone. I didn't want to pay a lot for a phone, but what can you do? I carefully considered each and every phone they had and compared it to the iPhone. The results fell into one of two catagories:

1) This phone is complete crap and they have the nerve to charge [$100..$200] for it.
2) This phone isn't an iPhone, but costs just as much.

So I bought the iPhone.

The installation experience was harrowing. I found out you have to activate it through iTunes. I hate iTunes. I hate QuickTime. I hate all Apple software. I hate all third party software. I don't like the way it infects my machine with little processes that run without asking and little icons littered about the desktop and quicklaunch and systray. I hates it all.

But my wife has an iPod, so it was already installed. What can you do?

However, I had to upgrade to the latest version of iTunes. So I fired up IE and went to apple.com. Halfway through the download, IE crashed.

So I used FireFox to download iTunes.

As a developer who used to work on Internet Explorer, you have no idea how much that hurt me. It was a sad, sad day. Snow flakes were reported in Hell.

But now I have the iPhone and it's the best phone ever and probably the best UI for anything other than PicLens.

Friday, March 14, 2008

WikiTalk redesign

My previous project, WikiTalk, has just undergone a major face lift this morning. I didn't know it was coming and was quite shocked to see it when I loaded it before work this morning.



Congratulations guys. It looks really good.