That's where COM apartment may help. Your ActiveX control is apartment threaded, which means that all calls to that object always must be executed on the same thread. Looks like your client also apartment threaded, but probably when you use your ActiveX object on other thread you didn't marhsall you interface pointer (CoMarshalInterface or CoMarshalInterThread..). One possible fix, that won't require much changes, is to put all client threads in free threaded apartment (each thread should calls CoInitialiseEx(NULL, COINIT_MULTITHREADED)). There will be slight perfomance hit, since all the calls to your object will be marshalled. If it's not acceptable ( or the client must be apartment threaded), than you'll need to use CoMarshal../Unmarshall or Global interface table (see IGlobalInterfaceTable, CLSID_StdGlobalInterfaceTable) to marshal interface pointer between apartments. In this case the calls from apartment that created object won't be marshalled. Hope this helps. Edward.