Atrybuty kierunkowe (parametr)
Atrybuty kierunkowe opisują, czy dane są przesyłane z klienta na serwer, serwer do klienta, czy oba te atrybuty. Wszystkie parametry w prototypie funkcji muszą być skojarzone z atrybutami kierunkowymi. Trzy możliwe kombinacje atrybutów kierunkowych to: 1) [w], 2) [się] i 3) [w, się]. Opisują one sposób przekazywania parametrów między wywołaniem i wywołaniami procedur. Podczas kompilowania w trybie domyślnym (tryb rozszerzony przez firmę Microsoft) i pomijasz atrybut kierunkowy dla parametru, kompilator MIDL zakłada domyślną wartość [w].
Parametr [] musi być wskaźnikiem. W rzeczywistości atrybut [się] nie ma znaczenia w przypadku zastosowania do parametrów, które nie działają jako wskaźniki, ponieważ parametry funkcji języka C są przekazywane przez wartość. W języku C wywołana funkcja odbiera prywatną kopię wartości parametru; nie może zmienić wartości funkcji wywołującej dla tego parametru. Jeśli jednak parametr działa jako wskaźnik, może służyć do uzyskiwania dostępu do pamięci i modyfikowania jej. Atrybut [out] wskazuje, że funkcja serwera powinna zwrócić wartość do funkcji wywołującej klienta, a pamięć skojarzona ze wskaźnikiem powinna być zwracana zgodnie z atrybutami przypisanymi do wskaźnika.
Poniższy interfejs przedstawia trzy możliwe kombinacje atrybutów kierunkowych, które można zastosować do parametru. Funkcja InOutProc jest zdefiniowana w pliku IDL jako:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
Pierwszy parametr, s1, jest [tylko w]. Jego wartość jest przesyłana do komputera zdalnego, ale nie jest zwracana do procedury wywołującej. Mimo że aplikacja serwera może zmienić jego wartość dla s1, wartość s1 na kliencie jest taka sama przed i po wywołaniu.
Drugi parametr ps2jest zdefiniowany w prototypie funkcji jako wskaźnik z atrybutami [w] i [się] . Atrybut [w] wskazuje, że wartość parametru jest przekazywana z klienta do serwera. Atrybut [out] wskazuje, że wartość wskazywana przez ps2 jest zwracana do klienta.
Trzeci parametr to [się tylko]. Miejsce jest przydzielane dla parametru na serwerze, ale wartość jest niezdefiniowana we wpisie. Jak wspomniano powyżej, wszystkie parametry [się] muszą być wskaźnikami.
Procedura zdalna zmienia wartość wszystkich trzech parametrów, ale tylko nowe wartości [się] i [w] parametry są dostępne dla klienta.
#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;
}
Po powrocie z wywołania do InOutProcsą modyfikowane drugie i trzecie parametry. Pierwszy parametr , który jest [tylko w], jest niezmieniony.