PRB: Visual Basic MTS/COM+ Components Should Not Implement Class_Initialize

This article was previously published under Q278501
This article has been archived. It is offered "as is" and will no longer be updated.
Code in the Class_Initialize method of a Visual Basic ActiveX dynamic-link library (DLL) can cause stability issues when the DLL is installed into Microsoft Transaction Server (MTS) or COM+ Services. In MTS, you may see one or both of the following events written to the Application event log:
Event ID: 4135
Source Transaction Server
Failed on creation within a server process. InitialBind (Package: YourPackage) (ProgId: YourClass.YourObject) (CLSID: {619FD1CF-2DA5-11D4-8A63-00A083360DAC}) (Interface: IClassFactory) (IID: {00000001-0000-0000-C000-000000000046}) (Method: 3) (Microsoft Transaction Server Internals Information: File: d:\viper\src\runtime\context\ccontext.cpp, Line: 2032)
Event ID 4129
Source Transaction Server
The run-time environment caught an exception during a call into your component. This error caused the process to terminate. ~CContext (Package: YourPackage) (ProgId: YourClass.YourObject) (CLSID: {619FD1CF-2DA5-11D4-8A63-00A083360DAC}) (Interface: IClassFactory) (IID: {00000001-0000-0000-C000-000000000046}) (Method: 4) (Microsoft Transaction Server Internals Information: File: d:\viper\src\runtime\context\ccontext.cpp, Line: 1104)
This problem occurs because the Visual Basic run time calls Class_Initialize before MTS creates the context wrapper for the component.
Do not implement Class_Initialize in an ActiveX DLL that you are going to install into MTS or COM+. If you need to initialize your object, use a separate initialization method or use the Activate method of the ObjectControl interface instead.
This problem was corrected in Microsoft Windows 2000 Service Pack 1.

ObjectContext is now available for Class_Initialize and Class_Terminate.
In an MTS or COM+ component, the Class_Initialize and Class_Terminate events should not contain code that attempts to access the object or its corresponding context wrapper. The Visual Basic run-time environment calls Class_Initialize before the object and its context are activated. Therefore, any operation in Class_Initialize that attempts to access the object or its context wrapper will fail.

You may also see this behavior with code in the Class_Terminate method. MTS destroys the object and its context wrapper before the Visual Basic run time calls the Class_Terminate method, so code in this event handler can also cause stability issues.

ActiveX Data Objects (ADO) connections that are opened in Class_Initialize will not participate in an MTS or COM+ transaction, because transaction enlistment is controlled by the object context.
For additional information, click the article number below to view the article in the Microsoft Knowledge Base:
250309 INFO: Do Not Use ObjectContext in Class_Initialize and Class_Terminate Events

Article ID: 278501 - Last Review: 02/28/2014 04:22:42 - Revision: 1.1

Microsoft Transaction Services 2.0, Microsoft COM+ 1.0, Microsoft Visual Basic Enterprise Edition for Windows 6.0

  • kbnosurvey kbarchive kberrmsg kbprb KB278501