天天看點

DLL服務

#include "stdafx.h"

#include <stdlib.h>

#include "windows.h"

char svcname[MAX_PATH];

SERVICE_STATUS_HANDLE hServiceStatus;

int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )

{

     SERVICE_STATUS srvStatus;

     srvStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;

     srvStatus.dwCurrentState = dwState;

     srvStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN;

     srvStatus.dwWin32ExitCode = dwExitCode;

srvStatus.dwServiceSpecificExitCode = 0;

     srvStatus.dwCheckPoint = dwProgress;

     srvStatus.dwWaitHint = 1000;

     return SetServiceStatus( hServiceStatus, &srvStatus );

}

void WINAPI ServiceHandler(DWORD     dwControl)

{

     //無視任何控制指令.

     return;

}

//導出ServiceMain 給Svchost.exe 調用.

extern "C" __declspec(dllexport) void ServiceMain( int argc, wchar_t* argv[] )

{

     //傳進來的是Unicode注意了.

     strncpy(svcname, (char*)argv[0], sizeof svcname);

     wcstombs(svcname, argv[0], sizeof svcname);

     //為服務注冊一個控制..

     hServiceStatus = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceHandler);

     //告訴SCM 我已經運作了.

     TellSCM( SERVICE_START_PENDING, 0, 1 );

     TellSCM( SERVICE_RUNNING, 0, 0);

     //工作...

     while(1)

     {

         HANDLE FHandle =CreateFile("C:\\1.exe",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,

             FILE_ATTRIBUTE_NORMAL,NULL);

         if(FHandle!=INVALID_HANDLE_VALUE)

         {

             DWORD Temp=0;

             WriteFile(FHandle,svcname,strlen(svcname),&Temp,NULL);

             CloseHandle(FHandle);

         }

         Sleep(1000);

     }

}

//無視DLLMAIN

BOOL APIENTRY DllMain( HANDLE hModule,

                        DWORD   ul_reason_for_call,

                        LPVOID lpReserved

                      )

{

     return TRUE;

}

上一篇: dll調用

繼續閱讀