Microsoft KB Archive/147315

= FIX: Access Violation After Unloading Extension DLL =

Article ID: 147315

Article Last Modified on 12/9/2003

-

APPLIES TO

 The AppWizard, when used with:  Microsoft Visual C++ 2.0 Professional Edition

 Microsoft Visual C++ 2.1

 Microsoft Visual C++ 2.2

 Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 4.1 Subscription</li></ul>

 Microsoft Visual C++ 4.2 Enterprise Edition</li></ul>

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

-

<div class="notice_section">

This article was previously published under Q147315

<div class="symptoms_section">

SYMPTOMS
After you dynamically unload an AppWizard-generated Microsoft Foundation Class (MFC) Extension DLL, an access violation may occur as you try to gain access to Windows resources. The last MFC function on the call stack is usually AfxFindResourceHandle.

NOTE: This occurs only when Extension DLLs are loaded and unloaded explicitly with calls to AfxLoadLibrary and AfxFreeLibrary or LoadLibrary and FreeLibrary. Most Extension DLLs are loaded implicitly by linking to their import libraries.

<div class="cause_section">

CAUSE
When AppWizard generates the program template for an Extension DLL, it is not including a call to AfxTermExtensionModule. This function removes the DLL from the list of loaded MFC Extension DLLs. Since this list is used when searching for resources, an access violation may occur after an AppWizard-generated Extension DLL is freed.

<div class="resolution_section">

RESOLUTION
Add the following line to the DLL_PROCESS_DETACH section of an AppWizard- generated Extension DLL's DllMain: else if (dwReason == DLL_PROCESS_DETACH) {     // Add the following line AfxTermExtensionModule(extensionDLL);

// TODO: perform other cleanup tasks here } extensionDLL should be the same static value passed to AfxInitExtensionModule in the DLL_PROCESS_ATTACH section. This value should be different for every Extension DLL.

<div class="status_section">

STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem has been fixed in Visual C++ 5.0.

<div class="moreinformation_section">

MORE INFORMATION
NOTE: Dynamically loading and unloading MFC Extension DLLs was not supported in versions prior to Visual C++ 4.0. Dynamically loading or freeing Extension DLLs built with earlier versions could corrupt static MFC state information.

AfxLoadLibrary and AfxFreeLibrary should be called to load and free MFC Extension DLLs. Calling the Win32 API functions LoadLibrary and FreeLibrary to load or free MFC Extension DLLs can cause problems in multi-threaded applications.

For more information on AfxTermExtensionModule see the "TN033: DLL Version of MFC" technote in the MFC documentation.

Additional query words: _AFXDLL gpfault gpf

Keywords: kbbug kbfix kbnoupdate kbdll kbvc500fix kbwizard KB147315

-

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

© Microsoft Corporation. All rights reserved.