Freigeben über


Direktionale Attribute (Parameter)

Direktionale Attribute beschreiben, ob die Daten von Client zu Server, Server zu Client oder beides übertragen werden. Alle Parameter im Funktionsprototyp müssen direktionalen Attributen zugeordnet werden. Die drei möglichen Kombinationen von direktionalen Attributen sind: 1) [in], 2) [out] und 3) [in, out]. Diese beschreiben die Art und Weise, wie Parameter zwischen aufrufenden und aufgerufenen Prozeduren übergeben werden. Wenn Sie im Standardmodus (erweiterter Microsoft-Modus) kompilieren und ein direktionales Attribut für einen Parameter weglassen, geht der MIDL-Compiler von einem Standardwert von [in] aus.

Ein [out]-Parameter muss ein Zeiger sein. Tatsächlich ist das [out]-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 für den Zugriff auf und die Änderung des Arbeitsspeichers verwendet werden. Das [out]-Attribut gibt an, dass die Serverfunktion den Wert an die aufrufende Funktion des Clients zurückgeben soll, und dass der dem Zeiger zugeordnete Arbeitsspeicher gemäß den Attributen zurückgegeben werden soll, die dem Zeiger zugewiesen sind.

Die folgende Schnittstelle veranschaulicht die drei möglichen Kombinationen von direktionalen Attributen, die auf einen Parameter angewendet werden können. Die Funktion InOutProc ist in der IDL-Datei wie folgt definiert:

void InOutProc ([in]       short     s1,
                [in, out]  short *  ps2,
                [out]      float *  pf3);

Der erste Parameter , s1, ist nur [in]. Der Wert wird an den Remotecomputer übertragen, aber 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 gleich.

Der zweite Parameter, ps2, wird im Funktionsprototyp als Zeiger mit den Attributen [in] und [out] definiert. Das [in]-Attribut gibt an, dass der Wert des Parameters vom Client an den Server übergeben wird. Das [out]-Attribut gibt an, dass der Wert, auf den ps2 verweist, an den Client zurückgegeben wird.

Der dritte Parameter ist nur [out]. Für den Parameter auf dem Server wird Speicherplatz zugewiesen, aber der Wert ist beim Eintrag nicht definiert. Wie bereits erwähnt, müssen alle [out]-Parameter Zeiger sein.

Die Remoteprozedur ändert den Wert aller drei Parameter, aber dem Client stehen nur die neuen Werte der Parameter [out] und [in] zur Verfügung.

#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;
}

Wenn der Aufruf von InOutProc zurückgegeben wird, werden der zweite und der dritte Parameter geändert. Der erste Parameter, der nur [in] ist, ist unverändert.

in Parametern

out-Parameter

In-Out-Parameter