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