程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 玩轉Windows服務系列——給Windows服務添加COM接口,windows接口

玩轉Windows服務系列——給Windows服務添加COM接口,windows接口

編輯:C++入門知識

玩轉Windows服務系列——給Windows服務添加COM接口,windows接口


當我們運行一個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簡單對象,如下:

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:

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, 結果如下:

result

參考資料

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接口

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved