Directional (Parameter)-Attribute
Richtungsattribute beschreiben, ob die Daten von Client zu Server, Server an Client oder beide übertragen werden. Alle Parameter im Funktionsprototyp müssen mit direktionalen Attributen verknüpft sein. Die drei möglichen Kombinationen von Richtungsattributen sind: 1) [in], 2) [] und 3) [in, ]. Diese beschreiben, wie Parameter zwischen aufrufenden und aufgerufenen Prozeduren übergeben werden. Wenn Sie im Standardmodus (Microsoft-erweiterter Modus) kompilieren und ein richtungsgesteuertes Attribut für einen Parameter weglassen, geht der MIDL-Compiler von einem Standardwert von [in].
Ein [] -Parameter muss ein Zeiger sein. Tatsächlich ist das Attribut [] nicht sinnvoll, wenn es auf Parameter angewendet wird, die nicht als Zeiger fungieren, da C-Funktionsparameter nach Wert übergeben werden. In C empfängt die aufgerufene Funktion eine private Kopie des Parameterwerts; der Wert der aufrufenden Funktion für diesen Parameter kann nicht geändert werden. Wenn der Parameter jedoch als Zeiger fungiert, kann er verwendet werden, um auf den Speicher zuzugreifen und ihn zu ändern. Das Attribut [] gibt an, dass die Serverfunktion den Wert an die aufrufende Funktion des Clients zurückgeben soll, und dass der dem Zeiger zugeordnete Speicher gemäß den Attributen zurückgegeben werden soll, die dem Zeiger zugewiesen sind.
Die folgende Schnittstelle veranschaulicht die drei möglichen Kombinationen von Richtungsattributen, die auf einen Parameter angewendet werden können. Die Funktion InOutProc- wird in der IDL-Datei definiert als:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
Der erste Parameter s1ist nur in]. Der Wert wird an den Remotecomputer übertragen, wird jedoch nicht an die aufrufende Prozedur zurückgegeben. Obwohl die Serveranwendung ihren Wert für s1ändern kann, ist der Wert von s1 auf dem Client vor und nach dem Aufruf identisch.
Der zweite Parameter, ps2, wird im Funktionsprototyp als Zeiger mit [in] und [] attributen definiert. Das Attribut [in] gibt an, dass der Wert des Parameters vom Client an den Server übergeben wird. Das Attribut [] gibt an, dass der wert, auf den ps2 verweist, an den Client zurückgegeben wird.
Der dritte Parameter ist [nur] aus. Der Speicherplatz wird für den Parameter auf dem Server zugewiesen, der Wert ist jedoch für den Eintrag nicht definiert. Wie bereits erwähnt, müssen alle [] Parameter zeiger sein.
Die Remoteprozedur ändert den Wert aller drei Parameter, aber nur die neuen Werte der [out] und [in] Parameter sind für den Client verfügbar.
#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;
}
Beim Zurückgeben vom Aufruf von InOutProcwerden die zweiten und dritten Parameter geändert. Der erste Parameter, der nur in]ist, ist unverändert.