玩轉Windows服務系列——給Windows服務添加COM介面

來源:互聯網
上載者:User

標籤:

當我們運行一個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介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.