Microsoft KB Archive/192912

= MSDev.exe does not automatically close when the COM reference count is zero =

Article ID: 192912

Article Last Modified on 6/10/2005

-

APPLIES TO


 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition
 * Microsoft Visual Studio 97 Service Pack 3
 * Microsoft Visual InterDev 1.0 Standard Edition
 * Microsoft Visual J++ 1.0 Standard Edition
 * Microsoft Visual J++ 1.1 Standard Edition

-



This article was previously published under Q192912



SYMPTOMS
After a Component Object Model (COM) client has loaded MSDev.exe using the COM automation interface, MSDev.exe does not automatically close when its last reference is released.



RESOLUTION
Use Application.Quit method of MSDev.exe to cause it to remove itself from memory just before releasing the last reference to it. See the MORE INFORMATION section of this article for sample Visual C++ and Visual Basic code.



STATUS
This behavior is by design.



MORE INFORMATION
MSDev.exe is the Developer Studio shell. In Visual Studio 97 it hosts Visual C++, Visual InterDev, Visual J++, and the InfoViewer. In Visual Studio 6.0, it only hosts Visual C++. It supports an automation interface that exposes its object model. An external application using the object model can access internal functions to automate tasks such as building projects, changing their settings, modifying text files, and so on.

The automation interface is based on COM technology. Most COM automation objects count the number of COM clients referencing them, and automatically terminate themselves when the reference count goes to zero. One example is Microsoft Word, which starts when a COM client creates a Word.Document object, and terminates when the last reference to that object is released.

In Visual C++, the following code illustrates proper automation of MSDev.exe: #import       // Create smart pointers for automation. using namespace DSSharedObjects; CoInitialize(NULL);       // Initialize COM.

IApplicationPtr pApplication;

if (pApplication.CreateInstance(__uuidof(DSSharedObjects::Application))   == S_OK) {     // Perform automation steps with pApplication.

pApplication->Quit; }

CoUninitialize; This Visual Basic code illustrates the use of the Quit method: Dim msdev As Object Set msdev = CreateObject("MSDev.Application") ' Create a new instance of                                                ' MSDev.exe.

' Perform automation steps here.

msdev.Quit          ' Force MSDev.exe to unload. Set msdev = Nothing ' De-reference MSDev.exe.

