FIX: ATL Servers Do Not Unregister Their Type Library (179688)



The information in this article applies to:

  • The Microsoft Active Template Library (ATL) 2.0, when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • The Microsoft Active Template Library (ATL) 2.1, when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0

This article was previously published under Q179688

SYMPTOMS

ATL servers do not remove type library registry entries when unregistered.

CAUSE

There is no code to remove type library registry entries.

RESOLUTION

Add the code below to each type of ATL server to make sure registry entries are removed.

In-Process Server

For an In-Process server, add the call UnRegisterTypeLib() to DllUnregisterServer():
STDAPI DllUnregisterServer(void)
{
   HRESULT hr = _Module.UnregisterServer();
   if (FAILED(hr))
      return hr;

#if _WIN32_WINNT >= 0x0400
   hr = UnRegisterTypeLib(LIBID_<ProjName>Lib, 1, 0,
      LOCALE_NEUTRAL, SYS_WIN32);
#endif
   return hr;
}
				

Local Server

For a local server, add the call to UnRegisterTypeLib() to WinMain():
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
   HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
   ...
   ...
   while (lpszToken != NULL)
   {
      if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
      {
         bRun = FALSE;
         _Module.UpdateRegistryFromResource(IDR_<ProjName>, FALSE);
         nRet = _Module.UnregisterServer();
         if (FAILED(nRet))
            break;

#if _WIN32_WINNT >= 0x0400
         nRet = UnRegisterTypeLib(LIBID_<ProjName>Lib, 1, 0,
            LOCALE_NEUTRAL,SYS_WIN32);
#endif
         break;
      }
      ...
      ...
   }
   ...
   ...
}
				

Service

For a service, add the call to UnRegisterTypeLib() to WinMain():
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
   HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
   ...
   while (lpszToken != NULL)
   {
      if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
      {
         int nRet = _Module.UnregisterServer();
         if (FAILED(nRet))
            return nRet;

#if _WIN32_WINNT >= 0x0400
         return UnRegisterTypeLib(LIBID_<ProjName>Lib, 1, 0,
            LOCALE_NEUTRAL, SYS_WIN32);
#endif
      }
      ...
      ...
   }
   ...
   ...
}
				


NOTE: UnRegisterTypeLib() is exported only by the newer version of Oleaut32.dll shipped with Windows NT 4.0, Windows 95 with DCOM, and Internet Explorer 3.x.

NOTE: Make sure the LCID and major and minor version numbers passed as parameters to UnRegisterTypeLib() are the same as that specified in the project .idl file. No lcid attribute in the .idl file implies LOCALE_NEUTRAL.

STATUS

This problem was corrected in ATL version 3.0, which shipped with Microsoft Visual C++ version 6.0.

(c) Microsoft Corporation 1997, All Rights Reserved. Contributions by Jaganathan Thangavelu, Microsoft Corporation

Modification Type:MajorLast Reviewed:12/8/2003
Keywords:kbATL300fix kbBug kbfix kbRegistry kbVC600fix KB179688