青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 60, 文章 - 0, 評論 - 197, 引用 - 0
數(shù)據(jù)加載中……

Win32 RPC 編程(一)

我們從一個簡單的 RPC “Hello, world!”的例子開始。
參考資料:MSDN: Win32 and COM Development -> Networking -> Network Protocols -> Remote Procedure Calls (RPC)


第1步:編寫 IDL(Interface Description Language,接口描述語言)文件
-------------------------------------------------------------------------
IDL 是一個通用的工業(yè)標(biāo)準(zhǔn)語言,大家應(yīng)該不陌生,因為 COM 里面也是用它來描述接口的。
Hello.idl:

[
     uuid("4556509F-618A-46CF-AB3D-ED736ED66477"),   // 唯一的UUID,用 GUIDGen 生成
     version(1.0)
]

interface HelloWorld 
{
     // 我們定義的方法
     void Hello([in,string]const char * psz);
     void Shutdown(void); 
}


一個可選的文件是應(yīng)用程序配置文件(.acf),它的作用是對 RPC 接口進行配置,例如下面的 Hello.acf 文件:
Hello.acf:


     implicit_handle(handle_t    HelloWorld_Binding) 


interface HelloWorld
{

}

上面定義了 implicit_handle,這樣客戶端將綁定句柄 HelloWorld_Binding 了,后面的客戶端代碼中我們會看到。


編譯 IDL 文件:
>midl Hello.idl
Microsoft (R) 32b/64b MIDL Compiler Version 6.00.0366
Copyright (c) Microsoft Corporation 1991-2002. All rights reserved.
Processing .\Hello.idl
Hello.idl
Processing .\Hello.acf
Hello.acf

 
我們可以看到自動生成了 Hello.h, Hello_s.c, Hello_c.c 文件,這些叫做 rpc stub 程序,不過我們可以不管這個概念,
我們只需要知道 Hello.h 里面定義了一個

extern RPC_IF_HANDLE HelloWorld_v1_0_s_ifspec;

這個 RPC_IF_HANDLE 將在后面用到。

 
第2步:編寫服務(wù)端程序
-------------------------------------------------------------------------
第1步中我們已經(jīng)約定了調(diào)用的接口,那么現(xiàn)在我們開始實現(xiàn)其服務(wù)端。代碼如下:
server.c

#include <stdlib.h>
#include <stdio.h>
#include "Hello.h"     // 引用MIDL 生成的頭文件

/**
 * 這是我們在IDL 中定義的接口方法
 * 需要注意一點,IDL 里面的聲明是:void Hello([in,string]const char * psz);
 * 但是這里變成了const unsigned char *,為什么呢?
 * 參見MSDN 中的MIDL Command-Line Reference -> /char Switch
 * 默認(rèn)的編譯選項,對 IDL 中的char 按照unsigned char 處理
 */

void Hello(const unsigned char * psz)
{
     printf("%s\n", psz);
}

 
/** 這也是我們在IDL 中定義的接口方法,提供關(guān)閉server 的機制*/
void Shutdown(void)
{
     // 下面的操作將導(dǎo)致 RpcServerListen() 退出
     RpcMgmtStopServerListening(NULL);
     RpcServerUnregisterIf(NULL, NULL, FALSE);
}

int main(int argc,char * argv[])
{
     // 用Named Pipe 作為RPC 的通道,這樣EndPoint 參數(shù)就是Named Pipe 的名字
     // 按照Named Pipe 的命名規(guī)范,\pipe\pipename,其中pipename 可以是除了\
     // 之外的任意字符,那么這里用一個GUID 串來命名,可以保證不會重復(fù)
     RpcServerUseProtseqEp((unsigned char *)"ncacn_np", 20, (unsigned char *)"\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}", NULL);   

     // 注冊接口,HelloWorld_v1_0_s_ifspec 是在MIDL 生成的Hello.h 中定義的
     RpcServerRegisterIf(HelloWorld_v1_0_s_ifspec, NULL, NULL);
   
     // 開始監(jiān)聽,本函數(shù)將一直阻塞
     RpcServerListen(1,20,FALSE);
     return 0;
}

// 下面的函數(shù)是為了滿足鏈接需要而寫的,沒有的話會出現(xiàn)鏈接錯誤
void __RPC_FAR* __RPC_USER midl_user_allocate(size_t len)
{
     return(malloc(len));
}

void __RPC_USER midl_user_free(void __RPC_FAR *ptr)
{
     free(ptr);
}

 

編譯:
>cl /D_WIN32_WINNT=0x500 server.c Hello_s.c rpcrt4.lib
用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 14.00.50727.42 版
版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。

server.c
Hello_s.c
正在生成代碼...
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:server.exe
server.obj
Hello_s.obj
rpcrt4.lib

編譯時為什么要指定 _WIN32_WINNT=0x500 呢?因為如果沒有的話會報告下面的錯誤:
Hello_s.c(88) : fatal error C1189: #error :  You need a Windows 2000 or later to
run this stub because it uses these features:

 
第3步:編寫客戶端程序
-------------------------------------------------------------------------
客戶端的代碼:
client.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Hello.h"     // 引用MIDL 生成的頭文件

int main(int argc, char * argv[])
{
     unsigned char * pszStringBinding = NULL;
     if ( argc != 2 )
     {
         printf("Usage:%s <Hello Text>\n", argv[0]);
         return 1;
     }   

     // 用Named Pipe 作為RPC 的通道。參見server.c 中的RpcServerUseProtseqEp() 部分
     // 第3 個參數(shù)NetworkAddr 如果取NULL,那么就是連接本機服務(wù)
     // 否則要取\\\\servername 這樣的格式,例如你的計算機名為jack,那么就是\\jack
     RpcStringBindingCompose( NULL, (unsigned char*)"ncacn_np", /*(unsigned char*)"\\\\servername"*/ NULL, (unsigned char*)"\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}", NULL, &pszStringBinding );

     // 綁定接口,這里要和 Hello.acf 的配置一致,那么就是HelloWorld_Binding
     RpcBindingFromStringBinding(pszStringBinding, & HelloWorld_Binding );   

     // 下面是調(diào)用服務(wù)端的函數(shù)了
     RpcTryExcept
     {
         if ( _stricmp(argv[1], "SHUTDOWN") == 0 )
         {
              Shutdown();
         }
         else
         {
              Hello((unsigned char*)argv[1]);
         }
     }
     RpcExcept(1)
     {
         printf( "RPC Exception %d\n", RpcExceptionCode() );
     }
     RpcEndExcept

 
     // 釋放資源
     RpcStringFree(&pszStringBinding);
     RpcBindingFree(&HelloWorld_Binding);
     return 0;
}

 
// 下面的函數(shù)是為了滿足鏈接需要而寫的,沒有的話會出現(xiàn)鏈接錯誤
void __RPC_FAR* __RPC_USER midl_user_allocate(size_t len)
{
     return(malloc(len));
}

void __RPC_USER midl_user_free(void __RPC_FAR *ptr)
{
     free(ptr);
}

 

編譯:
>cl /D_WIN32_WINNT=0x500 client.c Hello_c.c rpcrt4.lib
用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 14.00.50727.42 版
版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。

client.c
Hello_c.c
正在生成代碼...
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:client.exe
client.obj
Hello_c.obj
rpcrt4.lib

 

第4步:測試:
-------------------------------------------------------------------------
運行 server.exe,將彈出一個 console 窗口,等待客戶端調(diào)用。
運行客戶端 client.exe:

>client hello
可以看到 server.exe 的 console 窗口出現(xiàn) hello 的字符串。


>client shutdown
server.exe 退出。

示例下載
 

posted on 2008-04-28 18:50 Normandy 閱讀(23084) 評論(16)  編輯 收藏 引用 所屬分類: Networking

評論

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

你好,你的Win32 RPC 編程(一)讓我對Windows RPC編程有了一個很形象地認(rèn)識,非常感謝。不過我在用你的代碼做實驗時發(fā)現(xiàn)編譯有些問題,之今不知道為什么。還望賜教。

我用2005新建了一個c++ Console Application,然后按照你的順序,依次新建了Hello.idl和Hello.acf文件,編譯后,的確看到生成出來的Hello_c.c,Hello_h.h和Hello_s.c,但在Solution Explorer中看不到這些生成出來的文件。接著我復(fù)制完服務(wù)端程序后編譯后,出現(xiàn)下列錯誤:
1>RPCServer.obj : error LNK2019: unresolved external symbol __imp__RpcServerUnregisterIf@12 referenced in function _Shutdown
1>RPCServer.obj : error LNK2019: unresolved external symbol __imp__RpcMgmtStopServerListening@4 referenced in function _Shutdown
1>RPCServer.obj : error LNK2019: unresolved external symbol __imp__RpcServerListen@12 referenced in function _wmain
1>RPCServer.obj : error LNK2019: unresolved external symbol __imp__RpcServerRegisterIf@12 referenced in function _wmain
1>RPCServer.obj : error LNK2001: unresolved external symbol _HelloWorld_v1_0_s_ifspec
1>RPCServer.obj : error LNK2019: unresolved external symbol __imp__RpcServerUseProtseqEpW@16 referenced in function _wmain

如果我將那幾個生成出來的文件手動加入到Solution Explore中后,編譯后報下列錯誤:

1>Hello_s.c
1>c:\zhongwei\rpc\rpcserver\rpcserver\hello_s.c(226) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?
1>Hello_c.c
1>c:\zhongwei\rpc\rpcserver\rpcserver\hello_c.c(225) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

你能知道是什么原因造成的么?
2008-10-19 13:56 | 金中偉

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

我的EMAIL:juniorzhong@gmail.com
MSN:junior_zhong@tom.com

期待你的指點,謝謝!
2008-10-19 14:08 | 金中偉

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

@金中偉
其實沒有這么復(fù)雜,我是通過 Makefile 編譯的, 沒有用 IDE。你打開 Visual Studio 2005 Command Prompt 或 Visual Studio 2008 Command Prompt ,然后進到源碼目錄下 敲一個 nmake 命令, 所有的都會為你自動生成。細節(jié)可查看源碼目錄下的 Makefile 文件。
2008-10-20 10:09 | Normandy

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

@金中偉
你出錯的原因貌似是有些函數(shù)庫沒有添加到引用中,所以編譯時有無法解析的標(biāo)志錯誤。或者跟工程編碼有關(guān),自己察看下吧
2009-08-03 18:17 | qb

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

你的問題是沒有添加RPC Runtime Library,你可以在工程屬性的'連接器'下的輸入 添加'附加依賴項' Rpcrt4.lib,或者在你的CPP文件開頭添加如下語句
#pragma comment(lib, "Rpcrt4.lib")
2009-08-24 23:15 | Quincy, Hu

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

RPC 學(xué)好了,大有用處。
2009-10-14 21:49 | jc_ontheroad

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

問下大家,在windows下編譯器cl.exe 用/I來說明頭文件的路徑,用什么參數(shù)來說明庫文件的路徑啊?
2011-04-27 08:03 | liweihua

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

@liweihua
/LIBPATH:"X:\xxx\xxx"
2011-04-27 09:28 | 溪流

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

windows下有沒有像RPCGEN這樣的工具啊?
2011-08-24 16:38 | tal

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

呵呵,樓主,感謝你的文章啊。
我也喜歡用命令行編譯程序。呵呵
2012-05-25 15:16 | 憑凡

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

我在2010編譯的。結(jié)果是1714結(jié)果,
服務(wù)器起不來
2012-09-03 14:23 | 董香升

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

我把程序改成相應(yīng)的wchar_t的unicode版本。可是server.cpp中RpcServerUseProtseqEp返回1703號錯誤。找不到愿意,希望指點一下。我在開頭#define UNICODE了。
2012-09-04 11:31 |

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

我把程序改成相應(yīng)的wchar_t的unicode版本。可是server.cpp中RpcServerUseProtseqEp返回1703號錯誤。找不到愿意,希望指點一下。我在開頭#define UNICODE了。
2012-09-04 11:32 | 董香升

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

請教原因和解決方法:
網(wǎng)上獲取RPC實例,比如http://blog.163.com/junior_zhong/blog/static/27871180200891810561138/
在main()中的:
status = RpcServerUseProtseqEp(
reinterpret_cast <unsigned char*>("ncacn_np"),
nMaxCalls,
reinterpret_cast <unsigned char*>("//pipe//{a5194558-21a6-4978-9610-2072fcf1dc6e}"),
NULL );

編譯時出現(xiàn)錯誤:
error C2664: 'RpcServerUseProtseqEpW' : cannot convert parameter 1 from 'unsigned char *' to 'RPC_WSTR'
按照網(wǎng)上方法,reinterpret_cast <unsigned char*>可以解決兩個字符串問題,但是不能搞定最后一個參數(shù)NULL一直報錯C2664。
2012-09-06 14:34 | iHyy

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

@董香升
請問后來怎么解決的啊?
2015-07-13 15:58 | 范范

# re: Win32 RPC 編程(一)  回復(fù)  更多評論   

如果你沒有使用Makefile編譯而是采用vs的屬性中配置來編譯,server.cpp中RpcServerUseProtseqEp返回1703號錯誤, 或是RpcServerListen報錯。請在屬性頁->常規(guī)->字符集中選擇未設(shè)置,也就是disable UNICODE
2016-02-17 13:55 | zhang_luo@qq.com
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜理伦三级在线观看| 亚洲永久视频| 国产精品日韩一区二区| 欧美日韩免费在线观看| 欧美日本高清视频| 欧美视频精品在线观看| 国产精品www.| 国产在线麻豆精品观看| 在线观看欧美一区| 亚洲精品在线三区| 亚洲欧美国产日韩中文字幕| 欧美在线免费看| 免费不卡在线观看av| 亚洲电影在线观看| 亚洲欧洲精品一区二区三区不卡| 99成人精品| 久久狠狠久久综合桃花| 欧美高清在线播放| 国产欧美三级| 99精品视频免费| 久久久精品午夜少妇| 欧美成人一区二区三区| 亚洲天堂网在线观看| 久久久精品国产免大香伊 | 亚洲激情视频在线| 亚洲免费视频网站| 欧美二区乱c少妇| 国产精品亚洲аv天堂网 | 先锋影音国产精品| 欧美激情免费在线| 欧美伊久线香蕉线新在线| 欧美久久一级| 亚洲二区视频| 欧美亚洲综合在线| 亚洲人人精品| 久久免费视频网| 国产伦精品一区二区三区免费 | 日韩视频免费观看高清在线视频| 久久激情五月激情| 一区二区三区高清在线| 欧美大片免费| 亚洲第一精品夜夜躁人人躁| 久久精品日产第一区二区三区| 亚洲精品乱码久久久久久黑人 | 欧美日韩一区二区欧美激情 | 亚洲黄色一区| 久久野战av| 亚洲一区二区三区精品视频| 国内自拍亚洲| 午夜精品久久久久久久99黑人| 免费亚洲电影在线| 亚欧成人精品| 国产亚洲欧洲一区高清在线观看| 亚洲网在线观看| 亚洲美女色禁图| 欧美精品日本| 99精品国产高清一区二区| 欧美大片一区| 久热综合在线亚洲精品| 狠狠色伊人亚洲综合成人| 久久电影一区| 性8sex亚洲区入口| 黑人操亚洲美女惩罚| 久久综合精品国产一区二区三区| 亚洲欧美中日韩| 国产欧美精品日韩区二区麻豆天美| 亚洲欧美日韩网| 午夜精品久久久久久久久久久久| 国产欧美va欧美不卡在线| 欧美在线影院在线视频| 欧美亚洲综合久久| 亚洲国产经典视频| 亚洲日本电影在线| 国产精品久久久久久av下载红粉| 小黄鸭精品aⅴ导航网站入口| 午夜精品久久久久久久99水蜜桃 | 亚洲欧洲精品一区| 欧美日韩一区二区视频在线观看 | 国产精品嫩草99av在线| 欧美一级在线视频| 久久精品中文字幕一区二区三区| 韩日视频一区| 亚洲精品国产精品国产自| 国产精品久线观看视频| 久久免费视频一区| 欧美成人亚洲| 欧美一级午夜免费电影| 久久午夜精品一区二区| 制服诱惑一区二区| 欧美一区二区| 日韩一本二本av| 午夜综合激情| 夜夜爽www精品| 欧美中文字幕视频在线观看| 亚洲人成77777在线观看网| 亚洲天堂男人| 亚洲国产一区二区三区a毛片 | 欧美一二三区在线观看| 久久综合九色综合欧美狠狠| 亚洲午夜三级在线| 久久青草久久| 国产综合婷婷| 欧美日韩高清在线一区| 亚洲欧美制服另类日韩| 久久裸体视频| 一区二区免费在线播放| 久久精品夜夜夜夜久久| 亚洲一区尤物| 欧美激情精品久久久久| 久久综合九色99| 国产欧美视频在线观看| 亚洲精品自在在线观看| 亚洲高清成人| 久久超碰97人人做人人爱| 亚洲欧美日韩国产精品| 欧美国产日韩免费| 女同一区二区| 黑人一区二区三区四区五区| 亚洲一区二区免费| 在线视频欧美一区| 欧美国产第二页| 欧美激情一区二区三区在线视频 | 亚洲欧洲综合| 最新成人av在线| 久久综合狠狠综合久久激情| 久久精品国产欧美激情| 国产日韩欧美日韩| 午夜精品福利电影| 亚欧美中日韩视频| 国产乱理伦片在线观看夜一区| 99热这里只有成人精品国产| aaa亚洲精品一二三区| 欧美成人精品在线视频| 亚洲电影免费在线观看| 亚洲精品在线一区二区| 欧美日韩成人精品| 妖精视频成人观看www| 国产精品99久久久久久有的能看| 欧美精品福利视频| 日韩写真视频在线观看| 亚洲香蕉伊综合在人在线视看| 欧美日韩日日夜夜| 亚洲每日在线| 午夜精品亚洲| 韩国欧美国产1区| 蜜臀av国产精品久久久久| 亚洲欧洲另类国产综合| 制服丝袜亚洲播放| 国产精品每日更新| 午夜精品国产精品大乳美女| 久久久久久久成人| 在线免费日韩片| 欧美精品久久久久久| 一本久道久久综合婷婷鲸鱼| 亚洲午夜影视影院在线观看| 国产精品一区免费观看| 久久精品国产综合| 亚洲经典三级| 欧美亚洲在线视频| 亚洲高清自拍| 欧美日韩一区在线播放| 欧美一级理论片| 亚洲国产精品小视频| 香蕉av777xxx色综合一区| 在线观看一区欧美| 国产精品99一区二区| 久久婷婷影院| 亚洲欧美日韩在线高清直播| 久久精品噜噜噜成人av农村| 久久夜色精品国产| 亚洲精品一区二区在线| 国产老肥熟一区二区三区| 乱中年女人伦av一区二区| 夜夜夜精品看看| 免费久久久一本精品久久区| 亚洲午夜久久久久久久久电影网| 国内外成人免费视频| 欧美日韩国产在线看| 欧美在线视频日韩| 一区二区三区精品国产| 欧美大色视频| 性做久久久久久免费观看欧美| 91久久久在线| 国语自产在线不卡| 国产精品ⅴa在线观看h| 欧美福利视频在线| 久久精品国产99| 亚洲一区二区视频在线观看| 亚洲国产精品va| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲尤物视频网| 一本色道久久综合亚洲精品婷婷 | 国产精品美女www爽爽爽| 欧美大片免费观看| 久久久午夜精品| 欧美一区二区三区在线看 | 一区二区三区欧美成人| 亚洲第一黄色网| 国内精品亚洲| 国产一区日韩二区欧美三区|