【发布时间】:2018-12-03 07:04:20
【问题描述】:
在 Windows 7 中,VS2012 编译器
PostQueuedCompletionStatus(hCompletionPort, 0, (DWORD) pContext, &pOverlap->m_ol);
上述 API 调用工作正常。
但在 Windows 10 和 VS2017 编译器上,pContext 结构中的成员变量不可访问。
当我们从 DWORD 更改为 ULONG_PTR 时,它在 Windows 10 中运行良好
PostQueuedCompletionStatus(hCompletionPort, 0, (ULONG_PTR) pContext, &pOverlap->m_ol);
这种行为的原因是什么?
【问题讨论】:
-
根据documentation,该函数将
ULONG_PTR作为第三个参数,所以可能不同之处在于旧编译器让你摆脱它,而新编译器让你知道你是错误的。我猜你可能从编译器那里得到了某种警告。 -
是的——将整数转换为指针是实现定义的——通常意味着你不能(不应该)依赖这种行为。如果是指针,请使用指针 - 如果是 int,则使用它。在相关说明中,您说“pContext 不可访问” - 在这种情况下,空指针是合适的。
-
@pstrjds 警告?不一定,使用“旧”/32 位编译器,
ULONG_PTR和DWORD都可能是相同底层类型的别名... -
@pstrjds:
dw前缀确实是正确的 - 我设法挖掘的包含该功能的最古老的 SDK(Windows NT 4.0 SDK)确实将它作为DWORD;可能后来修复了;实际上,VC++6 中包含的 SDK 已经将其命名为ULONG_PTR,因此该类型可能在 1996 年至 1998 年之间的某个时间固定。 -
@MatteoItalia - 感谢您的挖掘,此时我只有 VS2017 和最新的 Windows SDK(谢天谢地 - 我曾经从事过一个项目,该项目有一个我们必须在 VC6 和因为有共享代码,我们必须小心我们如何修复与该库共享的部分 - 即共享代码中没有现代 C++ 等)。我在想一定有类似的东西,因为相关函数似乎都使用
lp前缀表示需要一个指针。