DLL专题之DllMain函数

来源:互联网 发布:淘宝买牛仔裤 编辑:程序博客网 时间:2024/05/17 09:16

DllMain函数,并没有什么好讲的.不就是加载和卸载DLL的时候用嘛!实际上,也不是这样.在一些高级应用中是很有用处的.今天,我们只是简单的测试测试.没有什么技术含量的.呵呵.那我们就看看吧:

首先,老步骤,建立一个Win32 DynamicLink(dll)选择一个简单的工程.,代码如下:

头文件:

#ifndef _DLLMAIN_DLL_H_
#define _DLLMAIN_DLL_H_

void ShowMessage( LPCTSTR pstrMsg, LPCTSTR pstrTitle );

#endif//_DLLMAIN_DLL_H_

实现文件:

#include "stdafx.h"
#include "DllMain.h"

BOOL APIENTRY DllMain(
       HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
      )
{
 switch( ul_reason_for_call )
 {
 case DLL_PROCESS_ATTACH:
  MessageBox(NULL, "DLL_PROCESS_ATTACH", "Information", MB_OK |MB_ICONINFORMATION);
  break;
 case DLL_THREAD_ATTACH:
  break;
 case DLL_PROCESS_DETACH:
  MessageBox(NULL, "DLL_PROCESS_DETACH", "Information", MB_OK |MB_ICONINFORMATION);
  break;
 case DLL_THREAD_DETACH:
  break;
 }
    return TRUE;
}

void ShowMessage( LPCTSTR pstrMsg, LPCTSTR pstrTitle )
{
 MessageBox( NULL, pstrMsg, pstrTitle, MB_OK |MB_ICONINFORMATION );

在.def文件中导出函数:

; DllMain.def
LIBRARY DllMain
EXPORTS
ShowMessage @ 1

然后是调用测试:

第一个测试是一般的调用:

void CDllDlg::OnBtnDllmain()
{
 // TODO: Add your control notification handler code here
 typedef void (*lpShowMessage)
  ( LPCTSTR pstrMsg, LPCTSTR pstrTitle );       //DLL里的函数原型
 
 HINSTANCE hInst = NULL;              //DLL的实例句柄,在WIN32中HINSTANCE和HMODULE可以互换使用
 lpShowMessage ShowMessage;             //函数定义
 
 hInst = LoadLibrary( ".//DllMain//Debug//DllMain.dll" );    //导入DLL
 if ( !hInst ) return ;
 /*-------------------------------------------------------------*/
 MAKEINTRESOURCE是通过序号获取函数名(字符串)的宏
 /*-------------------------------------------------------------*/
 ShowMessage = (lpShowMessage)GetProcAddress( hInst, MAKEINTRESOURCE(1) );
 if ( ShowMessage )
 {
  ShowMessage( _T("Hello World!"), _T("Information") );    //调用DLL里的函数
 }
 FreeLibrary( hInst );             //释放DLL
}

下一个是在线程中测试,只是好玩而已,没什么别的意图的,呵呵.

/*------------------------------------------*/
在一个线程中调用DLL
/*------------------------------------------*/
static DWORD ThreadProc(
      LPVOID lpParameter
      )
{
 typedef void (*lpShowMessage)
  ( LPCTSTR pstrMsg, LPCTSTR pstrTitle );       //DLL里的函数原型
 
 HINSTANCE hInst = NULL;              //DLL的实例句柄,在WIN32中HINSTANCE和HMODULE可以互换使用
 lpShowMessage ShowMessage;             //函数定义
 
 hInst = LoadLibrary( ".//DllMain//Debug//DllMain.dll" );    //导入DLL
 if ( !hInst ) return 0;
 /*-------------------------------------------------------------*/
 MAKEINTRESOURCE是通过序号获取函数名(字符串)的宏
 /*-------------------------------------------------------------*/
 ShowMessage = (lpShowMessage)GetProcAddress( hInst, MAKEINTRESOURCE(1) );
 if ( ShowMessage )
 {
  ShowMessage( _T("Hello World!"), _T("Information") );    //调用DLL里的函数
 }
 FreeLibrary( hInst );             //释放DLL
 
 return 0;
}
void CDllDlg::OnBtnDllmain2()
{
 // TODO: Add your control notification handler code here
 DWORD dwThread;
 HANDLE hThread = NULL;
 
 hThread = ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,NULL,0,&dwThread);
 if ( hThread )
 {
  CloseHandle(hThread);
 }
}

打完收工!BYE