Threading Model = "Both" query
 
Hi,
I have a global pointer to an object whose threading model is "Both". This 
contains a function called test() which would display the current threadid.
The code is soemthing like this.
#include "stdafx.h"
#import "Test.dll"
using namespace TestLib;
TestLib::ITestBothClassPtr spBoth = NULL;
DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
int _tmain(int argc, _TCHAR* argv[])
{
    //CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    CoInitializeEx(NULL,COINIT_MULTITHREADED);
    DWORD dwThreadId = 0
    HANDLE hThread = CreateThread(NULL,0,ThreadProc1,NULL,0,&dwThreadId);
    WaitForSingleObject(hThread,INFINITE);
    hThread = CreateThread(NULL,0,ThreadProc2,NULL,0,&dwThreadId);
    WaitForSingleObject(hThread,INFINITE);
    spBoth->Test();
    spBoth = NULL;
    CoUninitialize();
    return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
    CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    //CoInitializeEx(NULL,COINIT_MULTITHREADED);
    spBoth.CreateInstance(__uuidof(TestLib::TestBothClass));
    spBoth->Test();
    CoUninitialize();
    spBoth->Test();
    return 1;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
 spBoth->Test();
    return 1;
}
It does not matter what threading model we follow.
1. Here the second call to spBoth->Test() in ThreadProc1 works though I are 
calling it after CoUninitialize(). Also ThreadProc2's spBoth->Test() works 
properly. According to me both these calls should have failed. Can anyone 
tell me why?
2. If I stop calling CoInitializeEx in the primary thread the second call to 
spBoth->Test() in ThreadProc1 as well as spBoth->Test() in ThreadProc2 
crashes. Is COM doing something special for primary thread of an 
application?
3. In the main thread I commented off CoInitializeEx and CoUninitialize(). 
In the thread ThreadProc1 I commented off the call to CoUninitialize() and 
in ThreadProc2 I added CoInitializeEx and CoUninitialize(). Here 
spBoth->Test() crashes in ThreadProc2. My guess was that if its working in 
scenario 1 it should have worked here also.
Can anyone please help me out in understanding what exactly is happening 
here.
Thanks and Regards
Dinesh