无COM接口Windows服务启动失败的原因及解决方案

将VS创建的Windows服务项目编译生成的程序,通过命令行 “服务.exe -Service”注册为Windows服务后,就可以通过服务管理器进行管理了。

问题

通过服务管理器进行启动的时候,发现服务无法启动,提示错误

由于程序代码是由VS的项目模板生成的,生成后直接编译为Debug版,然后通过命令行进行注册,期间并没有修改过任何代码。

难道是只有Release版本才能通过服务管理器启动吗。于是将Release版注册为服务,通过服务管理器启动,仍然会报同样的错误。

由于服务比较特殊,应该会在Windows的事件管理器中留下日志,经查看,日志为

可以看到系统日志中并无异常。

问题还不只如此,当Debug版本通过 RegServer 注册后,程序也是启动后立即停止。

既然如此,那就开始使用神器——单步调试。

启动失败原因

Window服务程序启动后,会在WinMain方法中调用一个Run方法

CollapseHRESULT Run(_In_ int nShowCmd = SW_HIDE) throw()
{
    HRESULT hr = S_OK;

    T* pT = static_cast<T*>(this);
    hr = pT->PreMessageLoop(nShowCmd);

    // Call RunMessageLoop only if PreMessageLoop returns S_OK.
    if (hr == S_OK)
    {
        pT->RunMessageLoop();
    }

    // Call PostMessageLoop if PreMessageLoop returns success.
    if (SUCCEEDED(hr))
    {
        hr = pT->PostMessageLoop();
    }

    ATLASSERT(SUCCEEDED(hr));
    return hr;
}

而Run方法中会调用pT->RunMessageLoop()方法,来进行一个While循环,从而阻止WinMain方法返回,造成程序结束。

经过调试,发现执行时,pT->PreMessageLoop 方法返回了S_FALSE,由于RunMessageLoop方法前有一个判断,所以此方法没有执行,从而造成程序启动便立即停止。

而真正造成PreMessageLoop方法返回S_FALSE的原因是

hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);

调用RegisterClassObjects方法,返回了S_FALSE,而RegisterClassObjects方法又调用了AtlComModuleRegisterClassObjects方法,实际上是在注册Com相关的东西,而由于程序是由VS创建的默认代码编译的,并未添加任何Com接口,所以就会返回S_FALSE,即注册失败。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索windows
, 管理
, 程序
, 方法
, 服务
, 注册
, 服务启动失败
启动调试失败
接口调用失败怎么解决、be启动失败解决方法、word启动失败如何解决、java启动失败怎么解决、lol启动失败怎么解决,以便于您获取更多的相关知识。

时间: 2024-09-17 04:21:02

无COM接口Windows服务启动失败的原因及解决方案的相关文章

玩转Windows服务系列——无COM接口Windows服务启动失败原因及解决方案

原文:玩转Windows服务系列--无COM接口Windows服务启动失败原因及解决方案 将VS创建的Windows服务项目编译生成的程序,通过命令行 "服务.exe -Service"注册为Windows服务后,就可以通过服务管理器进行管理了. 问题 通过服务管理器进行启动的时候,发现服务无法启动,提示错误 由于程序代码是由VS的项目模板生成的,生成后直接编译为Debug版,然后通过命令行进行注册,期间并没有修改过任何代码. 难道是只有Release版本才能通过服务管理器启动吗.于是

VS2012编译的Windows服务启动后立即停止的解决方案

原文:VS2012编译的Windows服务启动后立即停止的解决方案  ATL中的BUG,在没有COM的服务中,使用_ATL_NO_COM_SUPPORT. 并在服务中添加下面的代码 #if defined(_ATL_NO_COM_SUPPORT) HRESULT PreMessageLoop(int nShowCmd) { SetServiceStatus(SERVICE_RUNNING); return ATL::CAtlServiceModuleT< CMemoryDBModule, IDS

CentOS 7下MySQL服务启动失败的快速解决方法_Mysql

今天,启动MySQL服务器失败,如下所示: [root@spark01 ~]# /etc/init.d/mysqld start Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe&qu

windows日志-TS888x64 服务启动失败

问题描述 TS888x64 服务启动失败 由于下列错误,TS888x64 服务启动失败: 系统找不到指定的路径. 解决方案 路径不对,查看你注册的服务在注册表中的路径是否正确,最好整个路径用引号括起来.

sqlserver2008r2-sqlserver2008 r2 非正常关机后,服务启动失败问题

问题描述 sqlserver2008 r2 非正常关机后,服务启动失败问题 错误日志: 2013-05-26 00:00:42.89 spid24s This instance of SQL Server has been using a process ID of 1720 since 2012/9/19 9:19:58 (local) 2012/9/19 1:19:58 (UTC). This is an informational message only; no user action

Windows服务启动超时时间的问题

最近有客户反映,机房出现断电情况,服务器的系统重新启动后,数据库服务自启动失败.第一次遇到这种情况,为了查看是不是断电情况导致数据库文件损坏,从客户的服务器拿到数据库的日志,进行分析. 要分析数据库启动失败的原因,首先说明一下数据库服务的工作机制. 数据库分为六大服务: 数据库的六大服务之间存在依赖关系,及启动流程:

Parallel port driver服务启动失败设置

Parallel port driver服务启动失败设置 解决办法:注册表 HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesParport中,将"start=3"改为"start=0"就可以了.

如何对win7旗舰版中的windows服务启动项顺序进行设置?

  虽然一再的对win7 64位旗舰版下载 iso的windows服务启动项进行精简,但是说来说去,因为很多服务启动项都是涉及到系统的,还是没办法禁用掉,但是大家是否知道,其实这些启动项是可以根据咱们的需求来对他们的启动顺序进行设置的,似乎现实生活中鲜少有用户会使用到这个功能,也许是鲜少有用户知道了解这个功能.那么今天小编就来讲解一下,如何在win7旗舰版中对win7旗舰版中的windows服务启动项顺序进行设置吧! 1.首先,咱们同时按下win7旗舰版键盘上的win+R快捷键打开电脑的运行窗口

win8安装sql2005过程,一直提示服务启动失败

问题描述 win8安装sql2005过程,一直提示服务启动失败 win8安装sql2005过程,一直提示服务启动失败 电脑系统是Win8 64位的 安装sqlserver2005过程中,提示服务启动失败 试了在网上找的替换 sqlserver.exe 和 sqlos.dll文件 也没用 用管理员Administrator登陆安装也一直,求解 解决方案 安装完成之后,停止SQL Server服务,去任务管理器找到sqlservr.exe进程,把它结束掉. 把备份的sqlservr.exe文件还原回