我想在RPC代码中定义一个新函数。我是新手,所以我只是复制函数Output
并将其重命名为Output2
。但是当我运行EXE时,总是调用Output函数,即使我真的调用了Output2。需要指南..
这是我在网上找到的代码。我认为它是某种存根文件..
以下是我正在使用的代码:
void Output(
/* [string][in] */ const char *szOutput)
{
NdrClientCall2(
( PMIDL_STUB_DESC )&Example1_StubDesc,
(PFORMAT_STRING) &Example1__MIDL_ProcFormatString.Format[0],
( unsigned char * )&szOutput);
}
void Output2( const char *test) // <---- I added this definition
{
NdrClientCall2(
( PMIDL_STUB_DESC )&Example1_StubDesc,
(PFORMAT_STRING) &Example1__MIDL_ProcFormatString.Format[0],
( unsigned char * )&test);
}
答案 0 :(得分:1)
this page上的图表可能有助于您了解以下说明。您所做的是创建第二个客户端存根,名为“Output2”但新客户端存根调用与“输出”相同的服务器存根(因为它将相同的值传递给参数1和2) NdrClientCall2)所以服务器存根最终调用相同的服务器应用程序函数。
假设您的RPC应用程序构造合理,则不应编辑包含NdrClientCall2调用的文件。客户端存根文件通常由MIDL编译器生成。您需要找到应用程序的IDL文件(可能还有相关的ACF文件),并为您的IDL添加Output2的定义。然后,当您重建客户端项目时,MIDL编译器应编译新修改的IDL文件(如果需要,还应编译ACF文件)并生成新的客户端存根。
类似地,当您编译服务器项目(使用相同的IDL)时,MIDL编译器将生成新的服务器存根文件。根据服务器应用程序的编写方式,您可能需要编辑服务器存根文件,以将存根连接到函数的实际实现。
有些文章here可能会有用,但如果您不了解RPC的工作方式,那么您可能会咬得更多,而不是咀嚼。