您的位置:首页 > 编程语言

使用服务加载启动的dll模板代码

2014-11-06 17:47 627 查看
有时创建服务启动,服务的dll写法格式有一定要求,写了一个简单的模板记录于此,方便查询

1.编译环境为vs2008
2.创建一个win32 dll项目
3.代码如下

#include "stdafx.h"
#include <windows.h>

#pragma comment(lib,"Advapi32.lib")

DWORD					dwCurrState;
SERVICE_STATUS_HANDLE	hSrv;	

int		TellSCM					( DWORD dwState, DWORD dwExitCode, DWORD dwProgress );
void		WINAPI ServiceMain		( int argc, wchar_t* argv[] );
void		__stdcall ServiceHandler( DWORD dwCommand );

DWORD WINAPI proc_thread(LPVOID lparam)
{
	OutputDebugStringA("proc_thread");

	return 0;
}

void Startup()
{
	CreateThread(NULL,NULL,proc_thread,NULL,NULL,NULL);
}

void WINAPI ServiceMain( int argc, wchar_t* argv[] )
{
	OutputDebugStringA("ServiceMain Load");
	TCHAR svcname[256];
	lstrcpy(svcname,argv[0]);
	hSrv = RegisterServiceCtrlHandler( svcname, (LPHANDLER_FUNCTION)ServiceHandler );
	if( hSrv == NULL )
	{
		OutputDebugStringA("SvcHostDLL RegisterServiceCtrlHandler failed");
		return;
	}else FreeConsole();

	TellSCM( SERVICE_START_PENDING, 0, 1 );
	TellSCM( SERVICE_RUNNING, 0, 0 );

	Startup();

	return;
}

int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )
{
	SERVICE_STATUS srvStatus;
	srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
	srvStatus.dwCurrentState = dwCurrState = dwState;
	srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
	srvStatus.dwWin32ExitCode = dwExitCode;
	srvStatus.dwServiceSpecificExitCode = 0;
	srvStatus.dwCheckPoint = dwProgress;
	srvStatus.dwWaitHint = 3000;
	return SetServiceStatus( hSrv, &srvStatus );
}

void __stdcall ServiceHandler( DWORD dwCommand )
{
	switch( dwCommand )
	{
	case SERVICE_CONTROL_STOP:
			TellSCM( SERVICE_STOP_PENDING, 0, 1 );
			TellSCM( SERVICE_STOPPED, 0, 0 );
			break;
	case SERVICE_CONTROL_PAUSE:
			TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
			TellSCM( SERVICE_PAUSED, 0, 0 );
			break;
	case SERVICE_CONTROL_CONTINUE:
			TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
			TellSCM( SERVICE_RUNNING, 0, 0 );
			break;
	case SERVICE_CONTROL_INTERROGATE:
			TellSCM( dwCurrState, 0, 0 );
			break;
	case SERVICE_CONTROL_SHUTDOWN:
			TellSCM( SERVICE_STOPPED, 0, 0 );
			break;
	}
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

4.创建一个def文件在里面写入导出文件内容如下

LIBRARY	verify

EXPORTS

ServiceMain

5.最后在vs2008中设置一下def文件,方法为,打开property pages,Linker-->Input-->Module Definition file,输入你的.def文件名
6.编译出的dll就可以被服务加载了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐