【发布时间】:2019-03-17 13:17:29
【问题描述】:
这几天我在使用 Windows RPC 时遇到了一个奇怪的问题。现在我找到了解决方案,但我想知道防止这个问题的正确方法是什么。
所以基本上我在调用NdrClientCall2 函数时遇到了问题。正如您在文档中看到的,此函数的第三个参数是指向客户端调用堆栈的指针。我将 midl.exe 生成的 C 代码更改为我自己的 C++ 版本,所以我的调用者看起来像这样:
void CppRpc::InternalCommand(int pSize, char buffer[1000000]) const
{
RpcTryExcept
{
NdrClientCall2(PMIDL_STUB_DESC(&m_rpc_stup_description),
PFORMAT_STRING(&MIDL_PROCFORMAT_STRING.Format[0]),
reinterpret_cast<unsigned char *>(&pSize));
}
RpcExcept(1)
{
std::cerr << "Runtime reported exception " << RpcExceptionCode()
<< std::endl;
}
RpcEndExcept
}
在使用完全优化的发布模式下,我遇到访问冲突一两天,然后我明白由于此函数中未使用参数buffer,编译器优化会以某种方式删除此参数。
但是我需要将此参数放在堆栈上,以便NdrClientCall2 可以将其流式传输到服务器。如果我将buffer 的任何用途(例如char dummy = buffer[0];)添加到功能伙伴中,那么它将正常工作。
所以我的问题是,如何防止这种情况下的优化? 我正在使用 Visual Studio 2017。
【问题讨论】:
标签: c++ optimization rpc