使用服务加载启动的dll模板代码
2014-11-06 17:47
627 查看
有时创建服务启动,服务的dll写法格式有一定要求,写了一个简单的模板记录于此,方便查询
1.编译环境为vs2008
2.创建一个win32 dll项目
3.代码如下
4.创建一个def文件在里面写入导出文件内容如下
5.最后在vs2008中设置一下def文件,方法为,打开property pages,Linker-->Input-->Module Definition file,输入你的.def文件名
6.编译出的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就可以被服务加载了。
相关文章推荐
- ListView动态加载数据模板(使用代码布局)
- ListView动态加载数据模板(使用代码布局)
- 加载.properties文件内容到内存----tomcat服务启动与停止的监听(使用ServletContextListener)
- ListView动态加载数据模板(使用代码布局)
- idea jetty插件启动服务后,修改代码报“请求的操作无法在使用用户映射区域打开的文件执行”
- 加载.properties文件内容到内存----tomcat服务启动与停止的监听(使用ServletContextListener)
- Oracle 11g 分布式事务 无法加载 DLL“oramts.dll” ;不能启动 distributed Transaction coordinator 服务;事务处理的分支长度 82 非法;
- win7 64位系统下 使用加载工具,加载驱动时提示“驱动服务启动失败”或者“此驱动程序被阻止加载”
- 解决IIS服务使用C#代码在Windows Server 2008上无法启动Excel的问题
- 如何在filter中使用bean实例,web服务启动配置加载顺序
- ListView动态加载数据模板(使用代码布局)
- ListView动态加载数据模板(使用代码布局)
- Dubbo框架初探【用Spring配置声明暴露服务(可以使用multicast广播注册中心暴露服务地址或者使用zookeeper注册中心暴露服务地址)、加载Spring配置,启动服务】
- 使用批处理实现启动和停止服务的代码分析(net start&net stop)
- ASP使用FSO读取模板的代码
- [导入]C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- ARM启动代码及ADS基本使用
- ASP使用FSO读取模板的代码