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

有时创建服务启动,服务的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就可以被服务加载了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值