Correction to COINIT_MULTITHREADED test

Paul Vriens Paul.Vriens at xs4all.nl
Tue Jan 11 01:33:31 CST 2005


On Mon, 2005-01-10 at 21:20, Bill Medland wrote:
> Bill Medland (billmedland at mercuryspeed.com)
> Correct testing for multithreaded
> (as spotted by Paul Vriens; fix suggested by Robert Shearman)
> 
Hi Bill,

it wasn't the check that was way over my head. The thing is, that with
this code change we walk a new path in COM_CreateApartment.

I don't know what the result is but in CoInitializeEx we do:

545   if (!(apt = COM_CurrentInfo()->apt))
546   {
547     apt = COM_CreateApartment(dwCoInit);
548     if (!apt) return E_OUTOFMEMORY;
549   }

and apparently that leaves us with a E_OUTOFMEMORY all the time. Which
means that we will not come to the part:

559   COM_CurrentInfo()->inits++;

and that leads to errors as:

trace:ole:CoInitializeEx ((nil), 4)
trace:ole:COM_CreateApartment thread 0xd is entering the multithreaded
apartment
trace:ole:CoInitializeEx ((nil), 2)
err:ole:CoInitializeEx Attempt to change threading model of this
apartment from 0x0 to 0x2

which also shows that the check is wrong. When CoInitializeEx is called
with COINIT_DISABLE_OLE1DDE it shouldn't go in.

What MSDN also says is:

Any combination of values from the COINIT enumeration can be used,
except that the COINIT_APARTMENTTHREADED and COINIT_MULTITHREADED flags
cannot both be set.

So should that be accounted for as well?

Cheers,

Paul.





More information about the wine-devel mailing list