2009-10-16 9 views
8

W niektórych IDL, z którymi pracuję zauważyłem, że istnieją 2 konwencje do oznaczania wartości zwracanych w metodach - [in, out] i [out, retval].Różnice między [w, out] i [out, retval] w definicjach COM IDL

Wydaje się, że [in, out] stosowany jest, gdy istnieje wiele wartości powrotnymi, na przykład:

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2 
); 

Wydaje się, że [out, retval] stosuje się, gdy występuje tylko jedna wartość powrotna, na przykład:

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1 
); 

Czy jest to konwencja COM IDL, czy tylko konwencja w kodzie, z którym pracuję?

Czy istnieje różnica funkcjonalna w kodzie, która zostanie wygenerowana z 2 notacji, czy też są one całkowicie zamienne?

Odpowiedz

23

[in, out] oznacza, że ​​poprawna wartość jest przekazywana, gdy metoda jest wywoływana i istnieje poprawna wartość (gdzie wskazuje wskaźnik), gdy metoda zwraca sukces. [out] oznacza, że ​​wskazana wartość może być dowolna, gdy metoda jest wywoływana, ale będzie ważna, gdy metoda zwróci sukces. Zarówno parametry [out], jak i [in, out] muszą być wskaźnikami - ich wartości są niezmienione i poprawne, a wymagania poprawności odnoszą się tylko do zmiennych, które wskazują.

[out, retval] to cukier syntaktyczny wskazujący, że podczas tworzenia opakowania Native COM Support ten parametr powinien zostać przekonwertowany na wartość zwracaną. Na przykład

HRESULT MyMethod([out] long* OutParam1, [out, retval] long* OutParam2); 

staje

long IWrappedInterface::MyMethod(long* OutParam1); 

Jeśli nie oznaczyć go [retval] owijarka będzie zawierać metodę z oryginalnym podpisem:

HRESULT IWrappedInterface::MyMethod(long* OutParam1, long* OutParam2); 

Tylko ten ostatni parametr może [out] być oznaczone jako [out, retval]. [in, out] Parametry nie mogą być oznaczone jako [retval].

+0

Dzięki za przydatne wyjaśnienie. – LeopardSkinPillBoxHat

+0

Chciałbym dodać, że '[in, out]' może nie być obsługiwane poprawnie przez wszystkie języki (dokładniej, old-school Visual Basic, nie wiem o .NET). –

+0

Zastanawiam się, czy [out, retval] jest niezgodne z najlepszą praktyką w celu zdefiniowania interfejsów COM, ponieważ nie ma sposobu na uzyskanie kodu błędu (HRESULT), jeśli wykonanie nie powiedzie się? – dave

0

Kolejną różnicą jest to, jak będzie się pojawiać w PIA w kodzie .NET.

[out, ret] pojawi się jako wartość zwracana w .NET.

[wyjście] pokaże argument dotyczący metody w .NET.