How soon we forget. A few years ago, I weaned myself off of Visual C++ and MFC and toyed (briefly) with ASP.NET
Now, I'm finally getting to grips with C#, .NET and CLR 4.0 and Silverlight.
And, all of a sudden, I'm thrust back to 1996. Why? Because we need to write a GINA (Graphical Identification aNd Authentication) component as part of a password reset application.
So, here we are, with definitely no CLR (which rules out C# and CLR) and recommended against the MFC. So, we're literally back in the days of defining dialog boxes as a set of resource definitions, and copious calls to CreateWindow. And that's before we get to the single threaded message pump that is WndProc.
Couple all of that with having to relearn C++ classes (compared to C#) and, most scarily, the fact that you need to clean up after yourself! malloc space for a string and remember that you need to free() them when you're done.
And here's another thing that never occurred to me; we're all used to googling for the answer, right? So, try googling on "create dialog" – you get pages of responses for C#, and VB, and ASP.NET, and SilverLight. You even get some response for MFC (whic you're not supposed to call from a GINA). But precious little for vanilla, plain WIN32 native code. Why? Because, by the time we all got to posting our every thought in blogs, forums, etc, the old fashioned way was dead and buried.
Get this; we're in the process of selling our home, with the plan to move elsewhere. As a consequence, we're renting some storage and we've moved all of what my wife calls "the crap", and what I refer to as "valued tomes of work that will help me in future years" into the most expensive garage-sized rental in Edinburgh. So, I went there last weekend and found, buried under a sea of DAT and DLT tapes, Citrix WinFrame manuals, and 56Kb modems, the book titled "Developing distributed applications with Visual C++ 6.0", circa 1999 – paper gold! It still expects me to be using MFC, so I still need to de-abstract (what's the real word for "de-abstract"?) a lot of it back to Win32 API, but it's reminding me of a whole load of concepts and techniques that I haven't used for almost 15 years.
Oh, and finally, the web may be a veritable desert of "how to do all of this the hard way", but I found one oasis; http://www.winprog.org/tutorial/
This has reminded me of everything I thought I already new, but had clearly forgotten.
Oh, and one final point… C#, SilverLight, CLR, ASP.NET, etc? These are "a good thing". I much prefer one line of code to perform a predictable task, compared to the 4 pages we used to take!

For this project, I've now built a number of resource based Dialogs, and then constructed .cpp files to handle the message pumps for each. Then, the account manager who sold the original concept (password reset, as you ask), popped by. She asked "so, is it quite difficult?".
I showed her my copy of "Developing distributed applications with Visual C++ 6.0" and said; "do you know… If I wanted to create this dialog in 2010 level C#, I would use 'CMyDialog x = new CMyDialog; x.Show()' and now, I have three pages of code. FOR ONE DIALOG!!! AND do you realise the complexities of managing resource.h and myproject.rc? DO YOU? DO YOU?????"
Then she ran away
Brings back memories of struggling through Charles Petzold's "Programming Windows" classic C/windows API book. Fortunately, MFC was already in use by the time I got a windows programming job and I never actually had to use straight C and the windows API in industry.
Ah – I remember Petzold…
Look; it got worse. Now I'm into the crypto API and the UTF-8 / widechar API without recourse to MFC. Definitely re-learning!
On the upside, I'm getting to design some architecturally neat classes, with lots of constructors that malloc tons of fields, and destructors that { if field { free(field); } }
When we talk about Inversion Of Control (IOC) it's easy to forget that the control for releasing resources has passed from the caller to the object. Easy to forget! _CrtDumpMemoryLeaks() is my new best friend