为什么我新建的属性化的工程安装成NT Service 在服务管理器里面不能启动呢?
谁有成功的例子?

解决方案 »

  1.   

    楼上,那个不是不是基于属性化的COM工程
      

  2.   

    up
    帮你顶如果喜欢c/c++ 是一种错误,我宁愿一错再错
      

  3.   

    看看你的_tWinMain代码是否有问题了..
    楼上的说了, msdn上的DrawServ是个很好的例子.
      

  4.   

    ATL7生成的属性化工程没有_tWinMain,只生成如下代码:
    // srv.cpp : WinMain 的实现#include "stdafx.h"
    #include "resource.h"// 模块属性使 WinMain 为您自动实现
    [ module(SERVICE, uuid = "{7AA51286-963D-454B-BA6E-665487007996}", 
     name = "srv", 
     helpstring = "srv 1.0 类型库", 
     resource_name="IDS_SERVICENAME") ]
    class CsrvModule
    {
    public:
    HRESULT InitializeSecurity() throw()
    {
    // TODO : 调用 CoInitializeSecurity 并为服务提供适当的 
    // 安全设置
    // 建议 - PKT 级别的身份验证、
    // RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别
    // 以及适当的非空安全说明符。 return S_OK;
    }
    };
      

  5.   

    我对比了一下, DRAWSERV 与我工程中 _tWinMain() 最大的不同是:我工程中多了这句话
        _Module.m_bService = FALSE;但不要这句话也太对头,还请详解
      

  6.   

    下面是CAtlServiceModuleT 中的成员函数,服务启动时调用,
    void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
    {
    lpszArgv;
    dwArgc;
    HRESULT hr = E_FAIL;
    // Register the control request handler
    m_status.dwCurrentState = SERVICE_START_PENDING;
    m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler);
    if (m_hServiceStatus == NULL)
    {
    LogEvent(_T("Handler not installed"));
    return;
    }
    SetServiceStatus(SERVICE_START_PENDING); m_status.dwWin32ExitCode = S_OK;
    m_status.dwCheckPoint = 0;
    m_status.dwWaitHint = 0; T* pT = static_cast<T*>(this);
    #ifndef _ATL_NO_COM_SUPPORT hr = T::InitializeCom(); ----》》》但执行到此处返回S_FALSE, 为何?
    if (FAILED(hr))
    return; m_bDelayShutdown = false;
    #endif
    // When the Run function returns, the service has stopped.
    m_status.dwWin32ExitCode = pT->Run(SW_HIDE);#ifndef _ATL_NO_COM_SUPPORT
    if (m_bService)
    T::UninitializeCom();
    #endif SetServiceStatus(SERVICE_STOPPED);
    LogEvent(_T("Service stopped"));
    }
      

  7.   

    你可以在项目建立时关掉属性代码的生成。而在已建立的项目中,你也可以把属性代码去掉,自已写_tWinMain函数,象VC6中那样。
      

  8.   

    你出现这个问题,是因为你的工程中,没有加入任何的控件,
    你加入一个atl control,然后重新编译,注册(MyAttributedService /service)。
    这样在控制面板中就可以启动了。
      

  9.   

    我这样做是成功的,我用vs.net 2003
      

  10.   

    做NT Service有必要加入一个control么?
    有什么用?
      

  11.   

    不是一定要加个control,而是要有CoClass,InitializeCom会注册service提供的组件服务,你都没有组件,服务个什么劲儿呀?
      

  12.   

    void CMyServiceModule::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
    {
    // TODO: 在此添加专用代码和/或调用基类
    lpszArgv;
    dwArgc;
    HRESULT hr = E_FAIL;
    // Register the control request handler
    m_status.dwCurrentState = SERVICE_START_PENDING;
    m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler);
    if (m_hServiceStatus == NULL)
    {
    LogEvent(_T("Handler not installed"));
    return;
    }
    SetServiceStatus(SERVICE_START_PENDING); m_status.dwWin32ExitCode = S_OK;
    m_status.dwCheckPoint = 0;
    m_status.dwWaitHint = 0;
    hr = InitializeCom();
    if (FAILED(hr))
    return; m_bDelayShutdown = false;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
    SetServiceStatus(SERVICE_RUNNING);
    ---------------------------------------------
    加上一句就可以正常启动起来,但是,要想能停掉还要自己做点别的处理了!
    --------------------------------
    while (1){
    Sleep(1000);
    } SetServiceStatus(SERVICE_STOPPED);
    LogEvent(_T("Service stopped"));
    //CAtlServiceModuleT<CMyServiceModule,IDS_SERVICENAME>::ServiceMain(dwArgc, lpszArgv);
    }