Irányított (paraméter) attribútumok
Az irányattribútumok azt írják le, hogy az adatok az ügyfélről a kiszolgálóra, a kiszolgálóról az ügyfélre vagy mindkettőre továbbítva lesznek-e. A függvény prototípusának minden paraméterét irányattribútumokkal kell társítani. Az irányattribútumok három lehetséges kombinációja: 1) [], 2) [ki] és 3) [, ki]. Ezek azt írják le, hogyan adják át a paramétereket a hívás és az úgynevezett eljárások között. Ha az alapértelmezett (Microsoft által bővített) módban fordít, és kihagy egy iránytribútumot egy paraméterhez, a MIDL fordító a [alapértelmezett értékét feltételezi].
A [out] paraméternek mutatónak kell lennie. A [ki] attribútum valójában nem értelmezhető olyan paraméterekre alkalmazva, amelyek nem működnek mutatóként, mert a C függvény paramétereit az érték adja át. A C-ben a hívott függvény megkapja a paraméterérték privát másolatát; nem módosíthatja a hívó függvény értékét a paraméterhez. Ha azonban a paraméter mutatóként működik, a memória eléréséhez és módosításához használható. A [out] attribútum azt jelzi, hogy a kiszolgálói függvénynek vissza kell adnia az értéket az ügyfél hívó függvényének, és hogy a mutatóhoz társított memóriát a mutatóhoz rendelt attribútumoknak megfelelően kell visszaadni.
Az alábbi felület bemutatja a paraméterekre alkalmazható irányattribútumok három lehetséges kombinációját. Az InOutProc függvény az IDL-fájlban a következőképpen van definiálva:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
Az első paraméter( s1) csak a [] paraméter. Értékét a rendszer a távoli számítógépre továbbítja, de nem adja vissza a hívási eljárásnak. Bár a kiszolgálóalkalmazás módosíthatja s1értékét, az ügyfélen s1 értéke megegyezik a hívás előtt és után.
A második paraméter, ps2, a függvény prototípusában mutatóként van definiálva, a [] és a [ki] attribútumokkal. A [] attribútum azt jelzi, hogy a paraméter értéke az ügyféltől a kiszolgálónak lesz átadva. A [out] attribútum azt jelzi, hogy a ps2 által által mutatott érték visszakerül az ügyfélhez.
A harmadik paraméter csak [ki] . A rendszer helyet foglal le a kiszolgáló paraméteréhez, de az érték nincs meghatározva a bejegyzéskor. Ahogy fentebb említettük, az összes [ki] paraméternek mutatónak kell lennie.
A távoli eljárás mindhárom paraméter értékét módosítja, de csak a [out] és a [in] paraméterek új értékei érhetők el az ügyfél számára.
#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;
}
Az InOutProc hívásából visszaérve a második és a harmadik paraméter módosul. Az első paraméter, amely csak] [] értéke, változatlan.
paraméterek