当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互。

那么当我们想与Windows服务进行实时交互的时候,我们应该怎么做呢?

快速给Windows服务添加实时交互功能的方案

Windows服务是一个进程,而我们用于交互的程序,又是另外一个进程。我们与Windows服务实时交互,其实就是一个进程间通信的问题。所有的进程间通信的方案基本上都适用于实时交互的方案,比如Socket、共享内存、管道、COM等。

这些方案中,当属COM的开发最快速,因为我们是给基于ATL的Windows服务添加COM接口嘛。

COM简介

组件对象模型,英文为Component Object Model,缩写COM,是微软的一套软件组件的二进制接口标准。这使得跨编程语言的进程间通信、动态对象创建成为可能。COM是多项微软技术与框架的基础,包括OLE, OLE自动化, ActiveX, COM+, DCOM, Windows shell, DirectX, Windows Runtime。详细介绍可以参考 组件对象模型

给服务添加COM接口

创建基于ATL的Windows服务可以参考 玩转Windows服务系列——创建Windows服务

接下来,快速给服务添加COM接口。

首先给项目添加了一个ATL简单对象,如下:

按上面步骤创建了ATL简单对象后,会产生这么一个文件:

ServiceComTest.idl

文件内容如下:

import "oaidl.idl";
import "ocidl.idl"; [
object,
uuid(4DDE5CA3-F5D7-4BC3-9045-E697297C5530),
dual,
nonextensible,
pointer_default(unique)
]
interface IIServiceComTest : IDispatch{
};
[
uuid(54A347BA-7689-4578-A346-C96D924BD637),
version(1.0),
]
library ServiceComTestLib
{
importlib("stdole2.tlb");
[
uuid(C264868C-91E7-4BFE-8DD9-32D0804E44F6)
]
coclass IServiceComTest
{
[default] interface IIServiceComTest;
};
};

这个idl文件就是用来定义COM接口的。

接下来给接口添加新的方法。

在类视图中,找到刚刚生成的接口 IIServiceComTest:

然后右键菜单,添加方法:

这样,就添加了一个add方法,x、y为输入,result为输出。

然后可以在idl文件中看到add方法的定义:

interface IIServiceComTest : IDispatch{
[id(1), helpstring("两个整数相加")] HRESULT add([in] LONG x, [in] LONG y, [out, retval] LONG* result);
};

实现COM接口

我们给COM接口添加的方法,只是一个声明、描述,我们还必须实现这个方法,其他进程才能与此服务通信。

在IServiceComTest.cpp文件中可以找到此方法:

STDMETHODIMP CIServiceComTest::add(LONG x, LONG y, LONG* result)
{
// TODO: 在此添加实现代码 return S_OK;
}

接下来就是实现此方法,如下:

STDMETHODIMP CIServiceComTest::add(LONG x, LONG y, LONG* result)
{
*result = x + y;
return S_OK;
}

这样,一个完整的COM接口及其实现就算是完成了,接下来需要通过测试程序调用此接口进行测试了。

调用COM接口

创建一个基本的控制台程序,然后将初始化测试代码,进行测试,代码如下:

#include "..\ServiceComTest\ServiceComTest_i.c"
#include "..\ServiceComTest\ServiceComTest_i.h"
#include <iostream>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
IIServiceComTest* test;
CoInitialize(NULL);
auto hresult = CoCreateInstance(CLSID_IServiceComTest,
NULL,
CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_HANDLER,
IID_IIServiceComTest,
(void**)&test); LONG x = 1;
LONG y = 2;
LONG result = 0;
hresult = test->add(x, y, &result);
cout << "result is " << result << endl;
system("pause");
}

这里,只是一个演示程序,省略了代码的错误处理。

运行程序,得到了正确的结果,result is 3, 结果如下:

参考资料

Step by Step COM Tutorial

COM in C++

COM(C++) programming tutorials

C/C++ COM Code Example: Reading Messages Asynchronously

系列链接

玩转Windows服务系列——创建Windows服务

玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理

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

玩转Windows服务系列——服务运行、停止流程浅析

玩转Windows服务系列——Windows服务小技巧

玩转Windows服务系列——命令行管理Windows服务

玩转Windows服务系列——Windows服务启动超时时间

玩转Windows服务系列——使用Boost.Application快速构建Windows服务

玩转Windows服务系列——给Windows服务添加COM接口

玩转Windows服务系列——给Windows服务添加COM接口的更多相关文章

  1. 玩转Windows服务系列——创建Windows服务

    创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...

  2. 玩转Windows服务系列——创建Windows服务

    原文:玩转Windows服务系列——创建Windows服务 创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Wi ...

  3. Spring Cloud微服务系列文,服务调用框架Feign

    之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON.    这种 ...

  4. 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足

    Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...

  5. 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3

    编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...

  6. 【SpringCloud构建微服务系列】微服务网关Zuul

    一.为什么要用微服务网关 在微服务架构中,一般不同的微服务有不同的网络地址,而外部客户端(如手机APP)可能需要调用多个接口才能完成一次业务需求.例如一个电影购票的手机APP,可能会调用多个微服务的接 ...

  7. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  8. 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理

    Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...

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

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

随机推荐

  1. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  2. 在PowerShell中使用curl(Invoke-WebRequest)

    前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...

  3. Git与Repo入门

    版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...

  4. IE8/9 本地预览上传图片

    本地预览的意思是,在选择图片之后先不上传到服务器,而是由一个<img>标签来预览本地的图片,非 IE8/9 浏览器可以从<input type="file"/&g ...

  5. 终端mysql Operation not permitted错误解决方案

    前言 前段时间装mysql,就遇到了ln: /usr/bin/mysql: Operation not permitted的错误,网上好多方法都过时了,下边是我的解决方法 原因 这是因为苹果在OS X ...

  6. JS图片上传预览插件制作(兼容到IE6)

    其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方 ...

  7. SAP CRM 性能小技巧

    导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...

  8. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  9. Linux上课笔记--随手记Linux命令

    初次接触Linux就是感觉这系统不够友好不够人性化,因为首先接触电脑就是win,图形化界面什么操作都可以清晰看到.随着更多的接触越来越发现Linux的强大,虽然我只是一个小白,可我就是爱上他了.现在就 ...

  10. 浅析Go语言的Interface机制

    前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...