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






.



Relevant Pages