4

有人知道在 Windows(非 .net)环境中进行远程过程调用的好方法吗?

我找不到太多关于如何做到这一点的信息,而且 msdn 只有 .net 版本。

.

编辑:

感谢您到目前为止的答案。我需要的是与同一台计算机上的服务进行通信,该服务会将进度报告发送回“客户端”。我对 rpc 感兴趣的原因是因为 vistas uac 以及服务如何与普通应用程序通信,除非它们使用 rpc 或管道。查看管道,它们似乎完全基于文本,我的印象是 rpc 可以传递强类型值。

我也会研究 DCOM。

4

7 回答 7

6

如果您只对同一台机器上的进程之间的对话感兴趣,boost::interprocess是一种很酷的方式,可以让它们通过一个通道进行对话。

更多特定于 Windows 的解决方案是共享内存映射文件和系统全局互斥体/信号或命名管道

boost::serialize和 google协议缓冲区是将您在进程之间发送的数据转换为二进制字符串的方法,这些字符串较少依赖于结构打包和其他可能在不同可执行文件之间有所不同的东西。

boost::interprocess、boost::serialize 和协议缓冲区应该独立于平台,因此从技术上讲它也可以在 Linux/Mac 上运行!

于 2009-01-15T12:53:03.767 回答
5

DCOM具有基于 DCE RPC 的远程过程调用机制。如果您将系统构建为 COM 组件或在要公开的 API 上放置 COM 包装器,则可以使用它。除此之外,您可能希望通过更深入地了解问题的细节来扩展您的问题。我真的不知道这个问题是否有任何可能妨碍使用 DCOM 的方面。

另一种方法是在应用程序周围放置一个 Web 服务包装器。Web 服务(当然是基于 SOAP 或 XML-RPC 的)实际上只是一种使用 HTTP 作为传输协议的 RPC 机制。

于 2009-01-15T12:23:24.077 回答
3

这里有更多信息:
获取“Microsoft Platform SDK for Windows Server 2003 R2”,在文件夹中安装查看示例 ...\Samples\NetDS\RPC
sdk_NetDS_RPC.exe - 源示例 soapsdk.exe - MS 示例
更多链接:
跟踪 RPC调用并通知您的程序的 COM+ 事件
FastRpc
安全 rpc
基于 XML 和 HTTP 的轻量级 RPC 库。
旧帮助,但有用RPC.HLP
[MS-RPCE]:远程过程调用协议扩展
[MS-RPCH]:基于 HTTP 协议规范的远程过程调用
[MS-COM]:Component Object Model Plus (COM+) 协议规范 DCOM

于 2009-01-20T01:32:19.930 回答
2

您可以通过一百种不同的方式在 Windows 上远程调用代码;套接字、DCom 等......微软在某一阶段支持 rpcgen(基于 DCE RPC),它允许您定义远程 API 调用,它的编译器将编写胶水代码。这是 DCOM 中的底层。

它与更易于使用和更广泛的标准的 UNIX ONC-RPC 不兼容。如果像 DCOM 这样的东西不适合您,您可能想查看其中一个 ONC_RPC 工具包。

托尼

于 2009-01-15T12:24:37.210 回答
1

是的,我同意 Isalamon - 只需使用 MIDL 中已经内置的真实 RPC。您可以获得一本关于 DCE RPC 的 O'Reilly 书籍。如果您在同一台机器上,只需使用 ncalrpc 的绑定主机。

于 2009-01-20T01:37:54.117 回答
0

是我们 1996 年在 Cheyenne Software 在 Win NT 上用于 InocuLAN 防病毒软件的东西。这是纯 RPC,没有 OO 层。我希望它在较新的 Windows 中仍然可用。

于 2009-01-15T13:26:15.107 回答
0

好吧,按照复杂性、开销和反向速度排序,我想到了这些可能性:

  • SOAP(你已经排除了)
  • 科尔巴
  • DCOM (DCE)
  • XML 消息的交换
  • ONC-RPC (SunRPC)
  • 交换类似 HTTP 的消息
  • 交换类似 telnet 的消息(面向线路)

总而言之,您将或多或少地准备好使用(准备受挫)库、包等作为开源。

上面的一些内容可能听起来很奇怪,但实际上,我们确实经常使用 HTTP 或 Telnet 进行 RPC。原因是您不需要花哨的环境来测试,任何大多数外来软件都可以轻松适应它。这些也使您的程序的服务可以轻松地从 WebBrowser、telnet 会话或其他只需打开一个套接字并发送请求的程序中使用。例如,我的大多数程序都包含一个 --scripting 命令行参数,它打开一个 telnet 端口,您可以通过该端口通过类似 JavaScript 的语言发送对整个应用程序对象模型的访问。这也可用于非常轻松地远程控制任何应用程序 - 无需任何努力。如果您曾经编写过这样的框架,则可以将其重用于每个新应用程序(请参阅此处的外观)

我不得不承认,我所有的应用程序都是在一个环境中编写的,上面所有的内容都已经包含在内并且可以作为客户端和服务器使用。

总结:用最简单的东西,就行了。您不需要 Corba 或 SOAP,除非您的应用程序需要集成到这样的基础架构中。

于 2009-01-15T13:50:51.170 回答