GetQueuedCompletionStatus里重叠结构参数的问题

Damn_boy 2011-03-06 08:27:45
为什么那个关于重叠结构的参数是一个二级指针
LPOVERLAPPED *lpOverlapped

而实际传递的参数只是一个普通的LPOVERLAPPED 然后强制转换为一个LPOVERLAPPED *

是我理解错了还是什么的、

OVERLAPPED ol;
GetQueuedCompletionStatus(NULL,NULL,NULL,(LPOVERLAPPED*)&(ol),INFINITE);

...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyyoung 2011-03-09
  • 打赏
  • 举报
回复
overlapped可以自己继承下,完成更多的业务需求

completekey也可以传入自己想要的结构,但必须在绑定到iocp的时候,就传入。
Damn_boy 2011-03-08
  • 打赏
  • 举报
回复
想知道这个函数内部是返回单纯的返回几个以前提交参数

__out LPDWORD lpNumberOfBytes,
__out PULONG_PTR lpCompletionKey,
__out LPOVERLAPPED *lpOverlapped,

还是返回那几个指针,并且对指针所指向的位置还做了写填充操作.

jwybobo2007 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 damn_boy 的回复:]
为什么那个关于重叠结构的参数是一个二级指针
LPOVERLAPPED *lpOverlapped

而实际传递的参数只是一个普通的LPOVERLAPPED 然后强制转换为一个LPOVERLAPPED *

是我理解错了还是什么的、
C/C++ code

OVERLAPPED ol;
GetQueuedCompletionStatus(NULL,NULL,NULL,(LPOVERLA……
[/Quote]

它可以是一个任意指针.

执行WSASend时可以传递一个重叠指针,而GetQueuedCompletionStatus要想获取这个指针,必须传递指向指针的指针,这样才能给它赋值,获取WSASend设置的指针,其实就这么简单.
缘之一念 2011-03-07
  • 打赏
  • 举报
回复
找到了。

是这个宏

#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))
Eleven 2011-03-07
  • 打赏
  • 举报
回复
缘之一念 2011-03-07
  • 打赏
  • 举报
回复
感觉这个参数不是这么用的。

我记得看IOCP编程的时候这个参数一般用来获取一个结构的地址;

例如:

//有如下结构
struct IOCPContext
{
int i;
int j;
OVERLAPPED ol;
...
};
//使用
IOCPContext ic; //这个要是全局或者动态分配的地址空间
PostQueuedCompletionStatus(hCompletionPort, dwNumberOfBytesTransferred, dwCompletionKey, &ic.ol);

//获取

LPOVERLAPPED lpol;
GetQueuedCompletionStatus(hIocp, &dwBytes, NULL, &lpol, INFINITE);

//这时候可以通过地址运算从lpol获取你传入的ic结构的地址,具体有个OFFSETOF宏好像;



也就是说这个参数是方便你把结构传入GetQueuedCompletionStatus函数。
凡是需要OVERLAPPED结构作为参数的地方,你都可以把它扩展成一个自己的结构,只要里面包含OVERLAPPED就可以了。
Damn_boy 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jwybobo2007 的回复:]
它可以是一个任意指针.

执行WSASend时可以传递一个重叠指针,而GetQueuedCompletionStatus要想获取这个指针,必须传递指向指针的指针,这样才能给它赋值,获取WSASend设置的指针,其实就这么简单.[/Quote]


我也是这么想的,不过感觉好别扭.
能举个例子不?
Damn_boy 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jwybobo2007 的回复:]
引用楼主 damn_boy 的回复:
为什么那个关于重叠结构的参数是一个二级指针
LPOVERLAPPED *lpOverlapped

而实际传递的参数只是一个普通的LPOVERLAPPED 然后强制转换为一个LPOVERLAPPED *

是我理解错了还是什么的、
C/C++ code

OVERLAPPED ol;
GetQueuedCompletionStatus(NU……
[/Quote]

我也是这么想的,不过感觉好别扭.
能举个例子不?
昨夜无风 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 damn_boy 的回复:]
为什么那个关于重叠结构的参数是一个二级指针
LPOVERLAPPED *lpOverlapped

而实际传递的参数只是一个普通的LPOVERLAPPED 然后强制转换为一个LPOVERLAPPED *

是我理解错了还是什么的、

C/C++ code

OVERLAPPED ol;
GetQueuedCompletionStatus(NULL,NULL,NULL,(LPOV……
[/Quote]

你确定这样不出错?
fishion 2011-03-06
  • 打赏
  • 举报
回复
两级指针,那就能够对这个指针进行内存申请,再进行赋值操作,而这样的内存申请对函数外也有效

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧