Směrové atributy (parametr)
Směrové atributy popisují, jestli se data přenášejí z klienta na server, ze serveru do klienta nebo z obou. Všechny parametry v prototypu funkce musí být přidružené ke směrovým atributům. Tři možné kombinace směrových atributů jsou: 1) [v], 2) [ven] a 3) [v, ven]. Tyto popisují způsob předávání parametrů mezi voláním a voláním procedur. Při kompilaci ve výchozím (rozšířeném režimu Microsoft) a vynecháte směrový atribut parametru, kompilátor MIDL předpokládá výchozí hodnotu [v].
Parametr [out] musí být ukazatel. Ve skutečnosti atribut [out] není smysluplný, pokud se použije na parametry, které nefungují jako ukazatele, protože parametry funkce jazyka C jsou předány hodnotou. V jazyce C obdrží volaná funkce soukromou kopii hodnoty parametru; nemůže změnit hodnotu volající funkce pro tento parametr. Pokud však parametr funguje jako ukazatel, lze jej použít pro přístup k paměti a jeho úpravě. Atribut [out] označuje, že funkce serveru by měla vrátit hodnotu volající funkci klienta a že paměť přidružená k ukazateli by měla být vrácena v souladu s atributy přiřazenými k ukazateli.
Následující rozhraní ukazuje tři možné kombinace směrových atributů, které lze použít na parametr. Funkce InOutProc je definována v souboru IDL takto:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
První parametr, s1, je [v] pouze. Jeho hodnota je přenášena do vzdáleného počítače, ale není vrácena do volající procedury. I když serverová aplikace může změnit jeho hodnotu pro s1, hodnota s1 na klientovi je stejná před a po volání.
Druhý parametr, ps2, je definován v prototypu funkce jako ukazatel s atributy [v] a [out]. Atribut [v] označuje, že hodnota parametru je předána z klienta na server. Atribut [out] označuje, že hodnota, na kterou odkazuje ps2 je vrácena klientovi.
Třetí parametr je pouze [out] . Pro parametr na serveru je přidělen prostor, ale hodnota není definována při zadání. Jak je uvedeno výše, všechny parametry [out] musí být ukazatele.
Vzdálený postup změní hodnotu všech tří parametrů, ale pro klienta jsou k dispozici pouze nové hodnoty [ven] a [v].
#define MAX 257
void InOutProc(short s1,
short * ps2,
float * pf3)
{
*pf3 = (float) s1 / (float) *ps2;
*ps2 = (short) MAX - s1;
s1++; // in only; not changed on the client side
return;
}
Při návratu z volání InOutProcse upraví druhý a třetí parametr. První parametr, který je [pouze v] je beze změny.