动态库入口函数

在编写MFC动态库的时候,有时候需要用到动态库入口函数DllMain,但是一般MFC都会调用自带的,而且在代码中试找不到DllMain的,鉴于此,我就把DllMain的函数给大家贴出来,如果有问题,请留言告知,我会在文章中修改一下。复制下面的代码,另存为“DLLMODUL.CPP”既可调用:

 

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "stdafx.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define new DEBUG_NEW

/////////////////////////////////////////////////////////////////////////////
// global data

// The following symbol used to force inclusion of this module for _USRDLL
#ifdef _X86_
extern "C" { int _afxForceUSRDLL; }
#else
extern "C" { int __afxForceUSRDLL; }
#endif

#ifdef _AFXDLL

static AFX_EXTENSION_MODULE controlDLL;

// force initialization early
#pragma warning(disable: 4074)
#pragma init_seg(lib)

/////////////////////////////////////////////////////////////////////////////
// static-linked version of AfxWndProc for use by this module

LRESULT CALLBACK AfxWndProcDllStatic(HWND, UINT, WPARAM, LPARAM);

class _AFX_DLL_MODULE_STATE : public AFX_MODULE_STATE
{
public:
 _AFX_DLL_MODULE_STATE() : AFX_MODULE_STATE(TRUE, AfxWndProcDllStatic, _MFC_VER)
  { }
};

static _AFX_DLL_MODULE_STATE afxModuleState;

#undef AfxWndProc
LRESULT CALLBACK
AfxWndProcDllStatic(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
 AFX_MANAGE_STATE(&afxModuleState);
 return AfxWndProc(hWnd, nMsg, wParam, lParam);
}

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState()
{
 AFX_MODULE_STATE* pModuleState = &afxModuleState;
 return pModuleState;
}

#endif

/////////////////////////////////////////////////////////////////////////////
// export DllMain for the DLL

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
 if (dwReason == DLL_PROCESS_ATTACH)
 {
  BOOL bResult = FALSE;

#ifdef _AFXDLL
  // wire up resources from core DLL
  AfxCoreInitModule();
#endif

  _AFX_THREAD_STATE* pState = AfxGetThreadState();
  AFX_MODULE_STATE* pPrevModState = pState->m_pPrevModuleState;

  // Initialize DLL's instance(/module) not the app's
  if (!AfxWinInit(hInstance, NULL, _T(""), 0))
  {
   AfxWinTerm();
   goto Cleanup;       // Init Failed
  }

  // initialize the single instance DLL
  CWinApp* pApp; pApp = AfxGetApp();
  if (pApp != NULL && !pApp->InitInstance())
  {
   pApp->ExitInstance();
   AfxWinTerm();
   goto Cleanup;       // Init Failed
  }

  pState->m_pPrevModuleState = pPrevModState;
#ifdef _AFXDLL
  // wire up this DLL into the resource chain
  VERIFY(AfxInitExtensionModule(controlDLL, hInstance));
  CDynLinkLibrary* pDLL; pDLL = new CDynLinkLibrary(controlDLL);
  ASSERT(pDLL != NULL);
#else
  AfxInitLocalData(hInstance);
#endif

  bResult = TRUE;

Cleanup:
  pState->m_pPrevModuleState = pPrevModState;
#ifdef _AFXDLL
  // restore previously-saved module state
  VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState) ==
   &afxModuleState);
  DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL);
#endif
  return bResult;
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
#ifdef _AFXDLL
  // set module state for cleanup
  ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL);
  AfxGetThreadState()->m_pPrevModuleState =
   AfxSetModuleState(&afxModuleState);
#endif

  CWinApp* pApp = AfxGetApp();
  if (pApp != NULL)
   pApp->ExitInstance();

#ifdef _DEBUG
  // check for missing AfxLockTempMap calls
  if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
  {
   TRACE1("Warning: Temp map lock count non-zero (%ld)./n",
    AfxGetModuleThreadState()->m_nTempMapLock);
  }
#endif
  AfxLockTempMaps();
  AfxUnlockTempMaps(-1);

  // terminate the library before destructors are called
  AfxWinTerm();

#ifdef _AFXDLL
  AfxTermExtensionModule(controlDLL, TRUE);
#else
  AfxTermLocalData(hInstance, TRUE);
#endif
 }
 else if (dwReason == DLL_THREAD_DETACH)
 {
  AFX_MANAGE_STATE(&afxModuleState);

#ifdef _DEBUG
  // check for missing AfxLockTempMap calls
  if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
  {
   TRACE1("Warning: Temp map lock count non-zero (%ld)./n",
    AfxGetModuleThreadState()->m_nTempMapLock);
  }
#endif
  AfxLockTempMaps();
  AfxUnlockTempMaps(-1);

  AfxTermThread(hInstance);
 }

 return TRUE;
}

#ifdef _AFXDLL

/////////////////////////////////////////////////////////////////////////////
// initialize app state such that it points to this module's core state

extern "C" BOOL WINAPI RawDllMain(HINSTANCE, DWORD dwReason, LPVOID);
extern "C" BOOL (WINAPI* _pRawDllMain)(HINSTANCE, DWORD, LPVOID) = &RawDllMain;

extern "C"
BOOL WINAPI RawDllMain(HINSTANCE, DWORD dwReason, LPVOID)
{
 if (dwReason == DLL_PROCESS_ATTACH)
 {
  // make sure we have enough memory to attempt to start (8kb)
  void* pMinHeap = LocalAlloc(NONZEROLPTR, 0x2000);
  if (pMinHeap == NULL)
   return FALSE;   // fail if memory alloc fails
  LocalFree(pMinHeap);

#ifndef _AFXDLL
  if (!AfxCriticalInit())
   return FALSE;
#endif

  // set module state before initialization
  _AFX_THREAD_STATE* pState = AfxGetThreadState();
  pState->m_pPrevModuleState = AfxSetModuleState(&afxModuleState);

 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  // restore module state after cleanup
  _AFX_THREAD_STATE* pState = AfxGetThreadState();
  VERIFY(AfxSetModuleState(pState->m_pPrevModuleState) ==
   &afxModuleState);
  DEBUG_ONLY(pState->m_pPrevModuleState = NULL);

#ifndef _AFXDLL
  AfxCriticalTerm();
#endif
 }
 return TRUE;
}

#endif //_AFXDLL

/////////////////////////////////////////////////////////////////////////////
// Special case for static library startup/termination

#ifndef _AFXDLL

// force initialization early
#pragma warning(disable: 4074)
#pragma init_seg(lib)

void AFX_CDECL AfxTermDllState()
{
 // terminate local data and critical sections
 AfxTermLocalData(NULL, TRUE);
 AfxCriticalTerm();

 // release the reference to thread local storage data
 AfxTlsRelease();
}

char _afxTermDllState = (char)(AfxTlsAddRef(), atexit(&AfxTermDllState));

#endif // !_AFXDLL

/////////////////////////////////////////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daiafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值