Microsoft Knowledge Base Article
This article contents is Microsoft Copyrighted material.
©2005-©2007 Microsoft Corporation. All rights reserved.
Terms
of Use |
Trademarks
Article ID: 96781 - Last Review: July 13, 2004 - Revision: 1.1
How To Use RPC Callback Functions
This article was previously published under Q96781
The standard remote procedure call (RPC) model has a server containing one
or more exported function calls, and a client, which calls the server's
exported functions. However, Microsoft's implementation of RPC defines
callbacks as a special interface definition language (IDL) attribute
allowing a server to call a client function.
Callbacks can be used only in the context of a server call. Thus, a server
may call a client's callback function only when the server is performing a
client's remote procedure call (before it returns from processing). For
example:
CLIENT SERVER
------ ------
Client makes RPC call. --->
<--- Server calls callback procedure.
Client returns from callback. --->
<--- Server calls callback procedure.
Client returns from callback. --->
<--- Server returns from original RPC call.
Callbacks are declared in the RPC .IDL file and defined in the source of
the client. The following demonstrates how callbacks are declared and
defined:
[ SAMPLE.IDL ]
[
uuid(9FEE4F51-0396-101A-AE4F-08002B2D0065),
version(1.0),
pointer_default( unique )
]
{
void RPCProc( [in, string] unsigned char *pszStr );
[callback] void CallbackProc([in,string] unsigned char *pszStr);
}
[ SAMPLEC.C (Client)]
/*
Callback RPC call (initiated from server, executed on client).
*/
void CallbackProc( unsigned char *pszString )
{
printf("Call from server, printed on client: %s", pszStr );
}
[ SAMPLES.C (Server)]
/*
"Standard" RPC call (initiated from client, executed on server).
Makes a call to client callback procedure, CallbackProc().
*/
void RPCProc( unsigned char *pszStr )
{
printf("About to call Callback() client function.."
CallbackProc( pszStr );
printf("Called callback function.");
}
In the makefile for the sample, the "-ms_ext" switch must be used for the
MIDL compile. For example:
midl -ms_ext -cpp_cmd $(cc) -cpp_opt "-E" sample.idl
APPLIES TO
- Microsoft Win32 Software Development Kit (SDK) 3.1
| kbhowto kbapi kbrpc kbnetwork KB96781 |
Community Feedback System
Very often, it takes hours to solve a problem. Very often, you've looked high
and low, and have tried a lot of solutions. When you finally found it, chances
are, it was because someone else helped you. Here's your chance to give back.
Use our community feedback tool to let others know what worked for you and what
didn't.
Please also understand that the community feedback system is not warranted to be
correct, it's simply a system that we've built to let people try and help each
other. If something in a feedback response doesn't make sense to you, or you're
not comfortable making changes that the feedback talks about (like registry
edits), please consult a professional.
Thank you for using kbAlertz.com Feedback System.
-- Scott Cate
Be the first to leave feedback, to help others about this knowledge base
article.
(Optional) Name
(Optional)
Public URL Or Email
Comments
No
HTML -- Text Only Please