Microsoft KB Archive/179688

= FIX: ATL Servers Do Not Unregister Their Type Library =

Article ID: 179688

Article Last Modified on 12/8/2003

-

APPLIES TO

 Microsoft ActiveX Template Library 2.0, when used with:  Microsoft Visual C++ 5.0 Enterprise Edition

 Microsoft Visual C++ 5.0 Professional Edition  Microsoft ActiveX Template Library 2.1, when used with:  Microsoft Visual C++ 5.0 Enterprise Edition

 Microsoft Visual C++ 5.0 Professional Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q179688

<div class="symptoms_section">

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

<div class="cause_section">

CAUSE
There is no code to remove type library registry entries.

<div class="resolution_section">

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;

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

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;

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

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;

return UnRegisterTypeLib(LIBID_<ProjName>Lib, 1, 0,           LOCALE_NEUTRAL, SYS_WIN32); }     ...      ...   }   ...   ... }
 * 1) if _WIN32_WINNT >= 0x0400
 * 1) 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.

<div class="status_section">

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

Additional query words: kbRegistry kbServer kbATL200 kbATL210 kbVC500 kbDSupport kbDSD kbatl300fix kbvc600fix

Keywords: kbbug kbfix kbregistry kbvc600fix kbatl300fix KB179688

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.