- 浏览: 2028286 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
Win32 RPC 编程(一) 示例下载
1.首先使用uuidgen工具($(VS)\Common7\Tools)生成idl接口文件
uuidgen /i /ohello.idl
注意"/o"和文件名之间没有空白!
2.然后打开生成的接口文件,在里面添加接口
[ uuid(d1717d33-8e03-456c-a79b-57fc212f5042), version(1.0), pointer_default(unique) ] interface hello { void HelloProc([in, string] unsigned char * pszString); void ShutDown(void); }
3.编写acf文件,此文件要与idl文件同名且放在同一目录下。此文件是可选的。
[ implicit_handle (handle_t hello_Binding) ] interface hello { }
4.使用midl编译idl文件
midl hello.idl
编译生成hello.h, hello_c.c, hello_s.c三个文件。hello.h为客户端和服务端共用头文件,hello_c.c要放到客户端,hello_s.c要放到服务端。
5.服务端部分代码
#include <iostream> #include <hello.h> using namespace std; int main(void) { RPC_STATUS status = 0; unsigned int nMinCalls = 1; unsigned int nMaxCalls = 20; status = RpcServerUseProtseqEp( (unsigned char *)"ncacn_np", nMaxCalls, (unsigned char *)"\\pipe\\{a5194558-21a6-4978-9610-2072fcf1dc6e}", NULL ); if ( status != 0 ) { cout<<"RpcServerUseProtseqEp return "<<status<<" !"<<endl; return 1; } status = RpcServerRegisterIf( hello_v1_0_s_ifspec, NULL, NULL ); if ( status != 0 ) { cout<<"RpcServerRegisterIf return "<<status<<" !"<<endl; return 1; } cout<<"Begin RPC server listen!"<<endl; status = RpcServerListen( nMinCalls, nMaxCalls, FALSE ); if ( status != 0 ) { cout<<"RpcServerListen return "<<status<<" !"<<endl; return 1; } cin.get(); return 0; } void * __RPC_USER MIDL_user_allocate(size_t len) { return (malloc(len)); } void __RPC_USER MIDL_user_free(void* ptr) { free(ptr); } void HelloProc(unsigned char *pszString) { cout<<pszString<<endl; } void ShutDown() { RPC_STATUS status = 0; status = RpcMgmtStopServerListening(NULL); if ( status != 0 ) cout<<"RpcMgmtStopServerListening return "<<status<<" !"<<endl; status = RpcServerUnregisterIf(NULL, NULL, FALSE); if ( status != 0 ) cout<<"RpcServerUnregisterIf return "<<status<<" !"<<endl; }
6.客户端代码
#include <iostream> #include <string> #include <hello.h> using namespace std; void doRpcCall(); int main(int argc, char** argv) { RPC_STATUS status; unsigned char * pszNetworkAddress = NULL; unsigned char * pszStringBinding = NULL; for ( int i = 1; i < argc; ++i ) { if ( strcmp(argv[i], "-ip") == 0 ) { pszNetworkAddress = (unsigned char *)argv[++i]; } } status = RpcStringBindingCompose( NULL, (unsigned char *)"ncacn_np", pszNetworkAddress, (unsigned char *)"\\pipe\\{a5194558-21a6-4978-9610-2072fcf1dc6e}", NULL, &pszStringBinding ); if ( status != 0 ) { cout<<"RpcStringBindingCompose return "<<status<<" !"<<endl; return 1; } cout<<"pszStringBinding = "<<pszStringBinding<<endl; status = RpcBindingFromStringBinding( pszStringBinding, &hello_Binding ); if ( status != 0 ) { cout<<"RpcBindingFromStringBinding return "<<status<<" !"<<endl; return 1; } doRpcCall(); status = RpcStringFree( &pszStringBinding ); if ( status != 0 ) cout<<"RpcStringFree return "<<status<<" !"<<endl; status = RpcBindingFree( &hello_Binding ); if ( status != 0 ) cout<<"RpcBindingFree return "<<status<<" !"<<endl; cin.get(); return 0; } void doRpcCall() { char buff[1024]; RpcTryExcept { while (true) { cout<<"Please input a string param for RPC call:"<<endl; cin.getline(buff, 1023); if ( strcmp(buff, "exit") == 0 || strcmp(buff, "quit") == 0 ) { ShutDown(); break; } else { HelloProc( (unsigned char *)buff ); cout<<"RPC call <HelloProc> succeed!"<<endl; } } } RpcExcept(1) { unsigned long ulCode = RpcExceptionCode(); cout<<"RPC exception occured! code: "<<ulCode<<endl; } RpcEndExcept } void * __RPC_USER MIDL_user_allocate(size_t len) { return (malloc(len)); } void __RPC_USER MIDL_user_free(void* ptr) { free(ptr); }
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1575__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2897解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1640RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1468使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1209使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20151、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1509防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5262// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1795VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3722深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4006原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3142获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7851VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18111SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1946解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7972字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115271.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2330下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1532BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2449对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ...
相关推荐
### Win32多线程编程知识点详解 #### 一、引言 随着计算机技术的发展,操作系统从最初的单任务模式逐步演进到了支持多任务、多线程的能力。Win32平台作为微软Windows操作系统的重要组成部分,提供了强大的多线程...
【深入浅出Win32多线程编程】深入解析了在Windows操作系统环境下如何进行多线程编程。在现代操作系统中,多线程是实现并发执行和高效资源利用的关键技术。Win32 API提供了丰富的功能来支持多线程的创建、管理和通信...
- **oncrpc_win32_release_2**:这可能是ONC RPC库的预编译二进制文件,版本号为2。这个库包含了实现RPC调用所需的函数和数据结构,供开发者的应用程序链接和使用。 **相关知识点** 1. **远程过程调用(RPC)**:...
《深入浅出Win32多线程程序设计》一书深入剖析了多线程编程的基础理论与实践技巧,尤其针对Win32平台进行了详尽的探讨。随着现代计算机系统的发展,多线程编程已经成为提升程序性能、充分利用硬件资源的关键技术之一...
protobuf-2.5+protoc-2.5.0-win32是一个针对Windows操作系统的Protocol Buffers(简称protobuf)编译器的版本,主要用于数据序列化。Protocol Buffers是由Google开发的一种高效的数据交换格式,它能够将结构化的数据...
标题中的"protoc-3.5.0-win32.zip"指的是Protocol Buffers(简称protobuf)的编译器protoc的3.5.0版本,适用于Windows 32位操作系统。Protocol Buffers是由Google开发的一种数据序列化协议,用于结构化数据的序列化...
标题 "protobuf2.5.0源码及win32文件" 涉及的主要知识点是Protocol Buffers(protobuf),这是Google开发的一种数据序列化协议,用于结构化数据的存储和交换。protobuf提供了一种高效、灵活且易于使用的机制,允许...
GRPC库是Google开源的一款高性能、开源和通用的RPC框架,它基于HTTP/2协议设计,支持多种语言,包括C++、C#等。在这个“grpc库库VS2015-win32_x64release与debug(包含命令)”的压缩包中,包含了在Windows平台上使用...
protobuf-2.5.0.zip和protoc-2.5.0-win32.zip是Google开源的Protocol Buffers(简称protobuf)的版本2.5.0的压缩包文件。protobuf是一种强大的数据序列化协议,它允许开发者将结构化的数据转换为可在网络上传输的二...
总的来说,`protoc-3.4.0-win32`提供了在Windows系统上处理和交换Protobuf数据的工具链,对于需要进行跨平台通信或高效数据存储的项目来说,这是一个非常重要的工具。通过遵循提供的安装指南,开发者可以轻松地将其...
标题中的"protoc-3.0.0-win32"指的是Protocol Buffers(简称protobuf)编译器的一个特定版本,适用于Windows 32位操作系统。Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的编码和解码,类似于...
标题中的"protoc-3.2.0-win32.zip"是一个针对Windows 32位系统的Protocol Buffers(简称protobuf)编译器的压缩包。Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的序列化,类似于XML、JSON,...
【深入浅出Win32多线程程序设计】是一篇探讨现代操作系统中多线程编程技术的文章,尤其针对Win32平台。理解多线程及其同步、互斥机制是掌握现代操作系统核心概念的关键,这对于开发者来说至关重要。通过精通Win32多...
protoc-3.6.0-win32是指protobuf编译器的3.6.0版本,专为Windows 32位系统设计。 **grpc**: gRPC是一个高性能、开源和通用的RPC框架,基于HTTP/2协议设计,由Google开发并维护。它使用protobuf作为接口定义语言,...