[in, size_is] and [out, size_is] Prototype

The following function prototype uses two counted strings. The developer must write code on both client and server to keep track of the character array lengths and pass parameters that tell the stubs how many array elements to transmit.

void Analyze(
    [in,  length_is(cbIn), size_is(STRSIZE)]    char  achIn[],
    [in]                                        long  cbIn,
    [out, length_is(*pcbOut), size_is(STRSIZE)] char  achOut[],
    [out]                                       long *pcbOut);

Note the parameters that describe the array length are transmitted in the same direction as the arrays: cbIn and achIn are [in] parameters while pcbOut and achOut are [out] parameters. As an [out] parameter, the parameter pcbOut must follow C convention and be declared as a pointer.

The client code counts the number of characters in the string, including the trailing zero, before calling the remote procedure as shown:

/* client */
char achIn[STRSIZE], achOut[STRSIZE];
long cbIn, cbOut;
...
gets_s(achIn, STRSIZE);                   // get patient input
cbIn = strlen(achIn) + 1;      // transmitted elements
Analyze(achIn, cbIn, achOut, &cbOut);

The remote procedure on the server supplies the length of the return buffer in cbOut as shown:

/* server */
void Analyze(char *pchIn,
             long cbIn,
             char *pchOut,
             long *pcbOut)
{
   ...
   *pcbOut = strlen(pchOut) + 1; // transmitted elements
   return;
}

The [string] attribute can be utilized when a parameter is known to be a string. This attribute directs the stub to calculate the string size, thus eliminating the overhead associated with the [length is] parameters. Additionally, it will direct the stub to verify the string is NULL terminated before passing the parameter to the application.