首先一个普遍的规则是,比如MSDN中的 api 函数,每一个参数都是有 in 或者 out 属性的,
[In]是输入参数,也就是说从用户到系统,系统根据这个参数作处理,参数参与函数运算,应该在使用前初始化。
[Out]是处理后系统返还给用户的 ,参数在运算后结果会改变,往往保存了运算的结果。这种参数一般是引用或者指针。
还有[in]和[out]都有的,兼有2者的性质。
举个例子如下:
- BOOL GetQueuedCompletionStatus(
- HANDLE CompletionPort,
- LPDWORD lpNumberOfBytes,
- PULONG_PTR lpCompletionKey,
- LPOVERLAPPED* lpOverlapped,
- DWORD dwMilliseconds);
其中lpNumberOfBytes、lpCompletionKey和lpOverlapped都是out类型的,对于out类型的参数,不要按照函数要求的指针类型定义,而是定义为值类型,只不过在传递的时候,传递指针,如下:
- DWORD dwNumberOfBytes;
- ULONG_PTR CompletionKey;
- LPOVERLAPPED lpOverlapped;
- 而不是:
- LPDWORD lpNumberOfBytes;
- PULONG_PTR lpCompletionKey;
- LPOVERLAPPED* lpOverlapped;
- 这样在传递的时候,就可以如下传递了:
- ::GetQueuedCompletionStatus(
- CompletionPort,
- &lpNumberOfBytes, //注意参数前的取地址符,下面同理
- &CompletionKey,
- &lpOverlapped,
- dwMilliseconds);
而对于类型为in的参数,在定义的时候,只需要定义为参数要求的类型就行了。比如上面api中,
DWORD dwMilliseconds,只需要这么定义就好了。
----2012.10.31
转载于:https://blog.51cto.com/20yuchen/1045073