I'm still(hopefully will remain?) pretty wet-behind-the-ears with respect to COM work. Though I do note that the behaviour you report is the same as that which I observe when starting a 32bit COM server under either windows xp or 7.
That is to say CLSIDFromProgId does just that - it returns a classID. A classID that you then use later to start the server with.
I work with gcc predominantly, so miss the advantages of the wizards in VS. as a result I've had to put together my own set of helper functions. Here's the one I use when starting a com server. Hope it's not entirely useless..
IDispatch *startServer(wchar_t *serverName)
wstring progId, errorMsg;
progId = serverName;
progId += L".Application";
HRESULT hr = CLSIDFromProgID(progId.c_str(), &clsid);
MessageBox(NULL, L"CLSIDFromProgID() failed", L"Error", 0x10010);
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pResult);
errorMsg = serverName;
errorMsg += L" not registered properly";
MessageBox(NULL, errorMsg.c_str(), L"Error", 0x10010);