【发布时间】:2014-07-03 05:53:07
【问题描述】:
我不太确定[in] 和[out] 如何与按值传递和按引用传递概念进行交互。 MSDN 文档明确指出[in] 表示数据从调用者流向被调用者,而[out] 是数据从被调用者流向调用者所必需的。
但是有人建议我对调用者可以检索结果的对象使用[in] 参数。
IDL 中的示例方法定义:
HRESULT _stdcall a_method( [in] long *arg1, [in] BSTR arg2, [in] IAnObject *arg3 );
在我的服务器实现这个方法(使用C++),我可以这样写:
*arg1 = 20;
arg2[0] = L'X'; // after checking length of string is not 0
arg3->set_value(50);
在客户端代码中,使用 C++:
long val1 = 10;
BSTR val2 = SysAllocString(L"hello");
IAnObject *val3 = AnObject_Factory::Create();
ptr->a_method(&val1, val2, val3);
当我尝试这个(通过进程内服务器使用我的对象)时,来自服务器的所有三个更改都传播到客户端,即val1 == 20、val2 是"Xello",而val3->get_value() 得到了@ 987654333@.
我的问题是:这是保证行为,即如果我使用进程外服务器或 DCOM 到另一台机器,它会在 val1、val2 和 val3 中看到相同的变化吗?
我之前认为[in] 向底层 RPC 表明该参数只需要在一个方向上编组;它不必尝试将更改发送回调用者。但现在我不太确定了。
我打算让我的对象与自动化兼容(即可从 VB6、Java 等使用 - 无需自定义编组),并且它应该能够通过 DCOM 而不是进程内使用,无需任何更改需要在客户端代码中。
【问题讨论】:
标签: com