首先一个普遍的规则是,比如MSDN中的 api 函数,每一个参数都是有 in 或者 out 属性的,

[In]是输入参数,也就是说从用户到系统,系统根据这个参数作处理,参数参与函数运算,应该在使用前初始化。

[Out]是处理后系统返还给用户的 ,参数在运算后结果会改变,往往保存了运算的结果。这种参数一般是引用或者指针。


还有[in]和[out]都有的,兼有2者的性质。

 

举个例子如下:

  1. BOOL GetQueuedCompletionStatus(   
  2. HANDLE CompletionPort, 
  3. LPDWORD lpNumberOfBytes,   
  4. PULONG_PTR lpCompletionKey, 
  5. LPOVERLAPPED* lpOverlapped,   
  6. DWORD dwMilliseconds); 

其中lpNumberOfBytes、lpCompletionKey和lpOverlapped都是out类型的,对于out类型的参数,不要按照函数要求的指针类型定义,而是定义为值类型,只不过在传递的时候,传递指针,如下:

 

  1. DWORD dwNumberOfBytes; 
  2. ULONG_PTR CompletionKey; 
  3. LPOVERLAPPED lpOverlapped; 
  4.  
  5. 而不是: 
  6.  
  7. LPDWORD lpNumberOfBytes; 
  8. PULONG_PTR lpCompletionKey; 
  9. LPOVERLAPPED* lpOverlapped; 
  10.  
  11. 这样在传递的时候,就可以如下传递了: 
  12. ::GetQueuedCompletionStatus(   
  13. CompletionPort, 
  14. &lpNumberOfBytes,  //注意参数前的取地址符,下面同理 
  15. &CompletionKey, 
  16. &lpOverlapped,   
  17. dwMilliseconds); 


而对于类型为in的参数,在定义的时候,只需要定义为参数要求的类型就行了。比如上面api中,
 

DWORD dwMilliseconds,只需要这么定义就好了。



----2012.10.31