Unterschiede zwischen [in, out] - und [out, retval] in COM-IDL-Definitionen
In einige der IDL-ich arbeite, habe ich gemerkt, es gibt 2 Konventionen für die Kennzeichnung Rückgabewerte in Methoden - [in, out]
und [out, retval]
.
Scheint es, dass [in, out]
wird verwendet, wenn es mehrere Werte zurückgeben, zum Beispiel:
HRESULT MyMethod(
[in] long InputParam,
[in, out] long* OutputParam1,
[in, out] long* OutputParam2
);
Scheint es, dass [out, retval]
wird verwendet, wenn es nur einen einzigen Rückgabewert, zum Beispiel:
HRESULT MyMethod2(
[in] long InputParam,
[out, retval] long* OutputParam1
);
Ist dies ein COM-IDL-convention oder nur eine Konvention in den code arbeite ich mit?
Gibt es einen funktionalen Unterschied in dem code, der generiert wird aus der 2 Notationen, oder sind Sie völlig austauschbar?
Du musst angemeldet sein, um einen Kommentar abzugeben.
[in, out]
bedeutet, dass ein Gültiger Wert übergeben, wenn die Methode aufgerufen wird, und ein Gültiger Wert, gibt es (wo der Zeiger), wenn die Methode erfolgreich zurückgegeben.[out]
bedeutet, dass der referenzierte Wert kann alles sein, wenn die Methode aufgerufen wird, aber es wird gültig, wenn die Methode erfolgreich zurückgegeben. Beide[out]
und[in, out]
Parameter sind Zeiger - Ihre Werte sind unverändert gültig und die Gültigkeit Anforderungen gelten nur für die Variablen, die Sie zeigen.[out, retval]
ist ein syntaktischer Zucker, um anzuzeigen, dass beim erstellen eine Native Unterstützung für COM-wrapper diese sehr-parameter umgewandelt werden soll, um einen Wert zurück. Zum Beispielwird
Wenn Sie nicht, markieren Sie es
[retval]
der wrapper enthält eine Methode, mit original-Unterschrift:Nur das Letzte
[out]
parameter gesetzt werden können[out, retval]
.[in, out]
Parameter können nicht markiert werden, wie[retval]
.[in,out]
kann nicht ordnungsgemäß abgewickelt werden, die von allen Sprachen (genauer gesagt, eine old-school-Visual Basic, nicht sicher .NET).HRESULT
zurückgegeben wird, und Sie können es überprüfen. Wenn Sie anrufen, eine Native Unterstützung für COM-wrapper gibt, die etwas anderes alsHRESULT
dann dieser wrapper wird über ein Häkchen drin, und rufen Sie_com_issue_error()
was abgebildet wird auf eine Funktion, die eine exception wirft. Also, das ist nicht ein problem.[in, out]
. Ein[in, out]
parameter behandelt werden, die von Visual Basic-code, der die Implementierung der Methode, als wenn es[out]
. Das bedeutet, dass alles, was Wert, den der parameter verweist, wenn die Methode aufgerufen wird, wird gestrichen und überschrieben werden, ohne zu prüfen, möglicherweise verursacht ein Leck. Manchmal spielt es keine Rolle (z.B. parameter verweist auf lokaler int), und manchmal ist es nicht (parameter zeigt auf ein BSTR)Weiterer Unterschied ist, wie dies wird zeigen, bis in einer PIA .NET-code.
[out, ret] erscheint als eine Rückkehr Wert .NET.
[aus] wird zeigen, bis ein Streit über die Methode .NET.