Answer to exercise: Pointer to member function cast

Yesterday’s exercise asked you to predict and explain the codegen for the following fragment: class Base1 { int b1; void Base1Method(); }; class Base2 { int b2; void Base2Method(); }; class Derived : public Base1, Base2 { int d; void DerivedMethod(); }; class Derived2 : public Base3, public Derived { }; void (Derived::*pfnDerived)(); void (Derived2::*pfnDerived2();…

3

I think this counts as having come full circle

First, ABBA rises to stardom in their native Sweden with Ring, Ring. They then win the Eurovision Song Contest with Waterloo, which is also recorded in English, French, German, and probably Spanish. Twenty-five years later, the English-language musical Mamma-Mia premieres in London and subsequently spreads through large portions of the world not yet civilized enough…

4

Pointers to member functions are very strange animals

Pointers to member functions are very strange animals. Warning: The discussion that follows is specific to the way pointers to member functions are implemented by the Microsoft Visual C++ compiler. Other compilers may do things differently. Well, okay, if you only use single inheritance, then pointers to member functions are just a pointer to the…

19

Adjustor thunks

Yesterday we learned about the layout of COM objects and I hinted at “adjustor thunks”. If you find yourself debugging in disassembly, you’ll sometimes find strange little functions called “adjustor thunks”. Let’s take another look at the object we laid out last time: class CSample : public IPersist, public IServiceProvider { public: // *** IUnknown…

15

The layout of a COM object

The Win32 COM calling convention specifies the layout of the virtual method table (vtable) of an object. If a language/compiler wants to support COM, it must lay out its object in the specified manner so other components can use it. It is no coincidence that the Win32 COM object layout matches closely the C++ object…

39

The Glass Engine and Ishkur’s Guide to Electronic Music

The Glass Engine is an interactive guide to the music of Philip Glass, organized by… um… at least they’re organized. By something. Bizarre yet oddly compelling. (Perhaps if we ask nicely, we can get Marc Miller to tell the story of the time he actually met Philip Glass…) In a similar vein, a friend of…

4

Answers to exercises – mismatching new/delete

Answers to yesterday’s exercises: What happens if you allocate with scalar “new” and free with vector “delete[]”? The scalar “new” will allocate a single object with no hidden counter. The vector “delete[]” will look for the hidden counter, which isn’t there, so it will either crash (accessing nonexistent memory) or grab a random number and…

13

Mismatching scalar and vector new and delete

In a previous entry I alluded to the problems that can occur if you mismatch scalar “new” with vector “delete[]” or vice versa. There is a nice description of C++ memory management in C++ Gotchas: Avoiding Common Problems in Coding and Design on www.informit.com, and I encourage you to read at least the section titled…

16

The management of memory for resources in 16-bit Windows

In a previous entry I threatened to discuss the way resources were managed in 16-bit Windows. In 16-bit Windows, resources were not loaded until explicitly requested. The FindResource function located the entry for the resource in the resource directory and returned it in the form of a HRSRC. The LoadResource function took that resource handle,…

13

What goes wrong when you add “Copy To” to the context menu

Lockergnome tipped people off to this page which talks (among other things) about adding “Copy To” to the context menu. I considered adding this tweak to Tweak UI but ultimately decided against. Here’s why: The “Copy to Folder” and “Move to Folder” options weren’t designed to be on the context menu. They were only meant…

17