`

Win32 RPC 编程(一)

    博客分类:
  • VC
阅读更多

 

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);
}
 

 

分享到:
评论

相关推荐

    win32多线程编程

    ### Win32多线程编程知识点详解 #### 一、引言 随着计算机技术的发展,操作系统从最初的单任务模式逐步演进到了支持多任务、多线程的能力。Win32平台作为微软Windows操作系统的重要组成部分,提供了强大的多线程...

    深入浅出win32多线程编程

    【深入浅出Win32多线程编程】深入解析了在Windows操作系统环境下如何进行多线程编程。在现代操作系统中,多线程是实现并发执行和高效资源利用的关键技术。Win32 API提供了丰富的功能来支持多线程的创建、管理和通信...

    oncrpc-win-proj.rar

    - **oncrpc_win32_release_2**:这可能是ONC RPC库的预编译二进制文件,版本号为2。这个库包含了实现RPC调用所需的函数和数据结构,供开发者的应用程序链接和使用。 **相关知识点** 1. **远程过程调用(RPC)**:...

    深入浅出Win32多线程程序设计.pdf

    《深入浅出Win32多线程程序设计》一书深入剖析了多线程编程的基础理论与实践技巧,尤其针对Win32平台进行了详尽的探讨。随着现代计算机系统的发展,多线程编程已经成为提升程序性能、充分利用硬件资源的关键技术之一...

    protobuf-2.5+protoc-2.5.0-win32

    protobuf-2.5+protoc-2.5.0-win32是一个针对Windows操作系统的Protocol Buffers(简称protobuf)编译器的版本,主要用于数据序列化。Protocol Buffers是由Google开发的一种高效的数据交换格式,它能够将结构化的数据...

    protoc-3.5.0-win32.zip

    标题中的"protoc-3.5.0-win32.zip"指的是Protocol Buffers(简称protobuf)的编译器protoc的3.5.0版本,适用于Windows 32位操作系统。Protocol Buffers是由Google开发的一种数据序列化协议,用于结构化数据的序列化...

    protobuf2.5.0源码及win32文件

    标题 "protobuf2.5.0源码及win32文件" 涉及的主要知识点是Protocol Buffers(protobuf),这是Google开发的一种数据序列化协议,用于结构化数据的存储和交换。protobuf提供了一种高效、灵活且易于使用的机制,允许...

    grpc库库VS2015-win32_x64release与debug(包含命令),头文件.zip

    GRPC库是Google开源的一款高性能、开源和通用的RPC框架,它基于HTTP/2协议设计,支持多种语言,包括C++、C#等。在这个“grpc库库VS2015-win32_x64release与debug(包含命令)”的压缩包中,包含了在Windows平台上使用...

    potobuf-2.5.0.zip和protoc-2.5.0-win32.zip

    protobuf-2.5.0.zip和protoc-2.5.0-win32.zip是Google开源的Protocol Buffers(简称protobuf)的版本2.5.0的压缩包文件。protobuf是一种强大的数据序列化协议,它允许开发者将结构化的数据转换为可在网络上传输的二...

    protoc-3.4.0-win32

    总的来说,`protoc-3.4.0-win32`提供了在Windows系统上处理和交换Protobuf数据的工具链,对于需要进行跨平台通信或高效数据存储的项目来说,这是一个非常重要的工具。通过遵循提供的安装指南,开发者可以轻松地将其...

    protoc-3.0.0-win32

    标题中的"protoc-3.0.0-win32"指的是Protocol Buffers(简称protobuf)编译器的一个特定版本,适用于Windows 32位操作系统。Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的编码和解码,类似于...

    protoc-3.2.0-win32.zip及安装步骤及编译例子

    标题中的"protoc-3.2.0-win32.zip"是一个针对Windows 32位系统的Protocol Buffers(简称protobuf)编译器的压缩包。Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的序列化,类似于XML、JSON,...

    深入浅出Win32多线程程序设计

    【深入浅出Win32多线程程序设计】是一篇探讨现代操作系统中多线程编程技术的文章,尤其针对Win32平台。理解多线程及其同步、互斥机制是掌握现代操作系统核心概念的关键,这对于开发者来说至关重要。通过精通Win32多...

    protoc-3.6.0-for-win32

    protoc-3.6.0-win32是指protobuf编译器的3.6.0版本,专为Windows 32位系统设计。 **grpc**: gRPC是一个高性能、开源和通用的RPC框架,基于HTTP/2协议设计,由Google开发并维护。它使用protobuf作为接口定义语言,...

Global site tag (gtag.js) - Google Analytics