有一段代码:HINSTANCE hInst = LoadLibrary("KERNEL32.DLL"); 
if(hInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);          
MYFUNC RegisterServiceProcessFun = NULL;    
RegisterServiceProcessFun =(MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");
if(RegisterServiceProcessFun)    
      //1 registers the process as a service process 
     RegisterServiceProcessFun(GetCurrentProcessId(),1);    
      
FreeLibrary(hInst); 
} 看起来好像是先找到一个函数的地址,然后通过函数指针调用,注册服务,
但RegisterServiceProcessFun =(MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");这句根本就没有执行成功这段代码是2000下的吗?

解决方案 »

  1.   

    而且我在msdn里找不到RegisterServiceProcess这个函数只找到RegisterServiceCtrlHandlerEx();我试着用RegisterServiceCtrlHandlerEx代替RegisterServiceProcess,结果创建应用程序的时候说exe访问拒绝
      

  2.   

    要在任务管理器的应用程序栏隐藏只要在oninitdialog里加一句就够了:
    ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); 怎么做成后台服务?还有什么办法吗
      

  3.   

    一个服务程序的例子://在服务控制管理器数据库中注册后台服务线程
    void CmdRegisterService()
    {
      SCHANDLE  schService;
      SCHANDLE  schSCManager;
      TCHAR szPath[512];
      //获得后台服务进程执行路径
      if(GetModuleFileName(NULL,szPath,512)==0)
      {tprintf(TEXT(“Unable to install %s - %s\n"),
      TEXT(“Service Example"), GetLastErrorText(szErr, 256));
       return;
      }
      //打开服务控制管理器数据库
      schSCManager=OpenSCManager(
             NULL,   //本地机器
             NULL,   //默认数据库
             SCMANAGERALLACCESS //访问权限
             );
      //在此数据库中创建后台服务线程对象
      if(schSCManager)
      { schService=CreateService(
        schSCManager, //服务控制管理器数据库
        TEXT(“ServiceExample"), //后台服务名称
        TEXT(“Service Example"),//在服务控制面板中显示的//服务名称
        SERVICE_ALL_ACCESS, //访问权限
        SERVICE_WIN32_OWN_PROCESS, //服务类型
        SERVICE_AUTO_START, //启动类型,随系统自动//加载
        SERVICE_ERROR_NORMAL,
        szPath,
        NULL,
        NULL,
    TEXT(“"),
    NULL,  //本地系统帐号
    NULL);// 没有口令
      //在这里可以创建多个后台服务线程对象,完成不同的
    //后台任务
      if(schService)
       {tprintf(TEXT(“%s installed.\n"),TEXT(“Service Example")); 
        CloseServiceHandle(schService);
       }
       else
       {tprintf(TEXT(“CreateService failed-%s\n"),
       GetLastErrorText(szErr, 256));
       }
       CloseServiceHandle(schSCManager);
      }
      else
       tprintf(TEXT(“OpenSCManager failed - %s\n"),
    GetLastErrorText(szErr,256));
    }
    //定义后台服务线程入口表
    SERVICETABLEENTRY MyServiceTable[]=
    {
       {
       TEXT(“ServiceExample"),//后台服务线程的名称
       (LPSERVICEMAINFUNCTION)MyServiceMain//后台服//务线程入口点
       },
       {NULL, NULL }   //标志表的结束
    };
    //服务线程入口函数
    void WINAPI MyServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
    {
      //注册服务控制处理函数
    sshStatusHandle=RegisterServiceCtrlHandler(TEXT(“ServiceExample"), Servi ceControlHandler);
      if(!sshStatusHandle)
    goto cleanup;
      //服务类型
      ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; 
      //指定的出错代码
      ssStatus.dwServiceSpecificExitCode=0;
      //启动自己定义的后台服务
      ServiceStart();
    cleanup:
      if(sshStatusHandle)
    (VOID)ReportStatusToSCMgr(
    SERVICESTOPPED,dwErr,0);
      return;
    }//服务控制处理函数:负责接收和处理服务控制管理器发出的
    //命令
    VOID WINAPI ServiceControlHandler(DWORD dwCtrlCode)
    {
      switch(dwCtrlCode)
      {
       //停止服务之前,应首先向服务控制管理器回送状态信息
       case SERVICE_CONTROLSTOP:
        ReportStatusToSCMgr(SERVICE_STOP_PENDING,NOE RROR, 0);
        ServiceStop();
        return;
       //更新服务状态
       case SERVICE_CONTROL_INTERROGATE:
        break;
       default:
        break;
      }
      //向服务控制面板管理器回送状态信息
      ReportStatusToSCMgr(ssStatus.dwCurrentState, NOERROR, 0); 
    }//设置当前服务状态并将状态信息回送到服务控制管理器
    BOOL ReportStatusToSCMgr(DWORD dwCurrentState,DWORD
    dwWin32ExitCode,WORD dwWaitHint)
    {
      static DWORD dwCheckPoint=1;
      BOOL fResult=TRUE;
      if(dwCurrentState==SERVICESTARTPENDING)
       ssStatus.dwControlsAccepted=0;
      else
       ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP;
      //设置状态信息
      ssStatus.dwCurrentState=dwCurrentState;
      ssStatus.dwWin32ExitCode=dwWin32ExitCode;
      ssStatus.dwWaitHint=dwWaitHint;
      if((dwCurrentState==SERVICE_RUNNING )‖
       (dwCurrentState==SERVICE_STOPPED))
       ssStatus.dwCheckPoint=0;
      else
       ssStatus.dwCheckPoint=dwCheckPoint++;
      //将状态信息回送到服务控制管理器
      if(!(fResult=SetServiceStatus(sshStatusHandle,&ssStatus))){
       AddToMessageLog(TEXT(“SetServiceStatus"));//向NT事//件管理器报告出错消息
       }
       return fResult;
    }//服务进程入口
    voidCRTAPI1 main(int argc, char **argv)
    {
      if((argc>1)&&((*argv[1]==‘-')‖(*argv[1]==‘/')) )
      {
       if(stricmp(“register", argv[1]+1)==0)
        CmdRegisterService(); //注册后台服务线程对象
       else
        goto dispatch;
       exit(0);
      }
      dispatch:
       //启动服务控制分配器,建立主线程与服务控制面板的
    //连接
       if(StartServiceCtrlDispatcher(MyServiceTable))
        AddToMessageLog(TEXT (“StartServiceCtrlDispatcher success."));
    }void ServiceStart()
    {
      //向服务控制管理器报告服务正在启动
      if(!ReportStatusToSCMgr(
    SERVICE_START_PENDING, //service state
    NOERROR,
    dwWaitHint))
    return;
      //下面是线程的初始化代码(注意:初始化代码执行时间
    //不应超过设定的nWaitHi nt,否则服务控制管理器会认
    //为服务线程已经没有响应
      //向服务控制管理器报告服务已经启动
      if(!ReportStatusToSCMgr(
    SERVICE_RUNNING,  //service state
    NOERROR,   //exit code
    0))    //wait hint
       return;
    //开始执行服务
    }
    //停止后台服务线程
    void ServiceStop()
    {
      //添加结束服务线程代码
    }
    BTW,好像开发驱动程序可以实现真正的隐藏,不过,我没试过.
      

  4.   

    http://www.csdn.net/expert/topic/668/668931.xml?temp=.455578
      

  5.   

    没有任何真正有效的方法只是骗一下应用程序的话可以参考一下http://www.driverdevelop.com/forum/html_12971.html?1021305846