社区
C++ 语言
帖子详情
ULONG_PTR到底是什么?
hhh_hao
2011-03-25 11:12:47
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。
typedef _W64 unsigned long ULONG_PTR
...全文
4970
14
打赏
收藏
ULONG_PTR到底是什么?
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。 typedef _W64 unsigned long ULONG_PTR
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
freeishwk
2013-11-14
打赏
举报
回复
2楼3楼说的不是一样吗……
hhh_hao
2011-03-25
打赏
举报
回复
[Quote=引用 5 楼 lactoferrin 的回复:]
ULONG_PTR就是能够装得下指针的无符号整数,
[/Quote]
不是很明白这句话的意思,
Lactoferrin
2011-03-25
打赏
举报
回复
在进行指针的整数运算时可以用ULONG_PTR作类型转换
Lactoferrin
2011-03-25
打赏
举报
回复
ULONG_PTR就是能够装得下指针的无符号整数,在32位被定义成unsigned long,在64位被定义成unsigned __int64
w64是如果是64位则警告
hhh_hao
2011-03-25
打赏
举报
回复
2楼和3楼好像是矛盾的呀, 谁能给个确定的答复呢?
秃头披风侠
2011-03-25
打赏
举报
回复
1
无符号(u) 长整型(long) 指针(ptr)
zhh_kv
2011-03-25
打赏
举报
回复
1. ULONG_PTR 只是专门用于内核程序 (Kernel 或 Device Driver) 使用的数据类型,
当作指针时它应当指向系统内核地址空间 (因此最高位为 1),另外它还可当作偏移量。
2.
定义:
ULONG_PTR
Unsigned LONG_PTR.
This type is declared in Basetsd.h as follows:
#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/windows_data_types.asp
pathuang68
2011-03-25
打赏
举报
回复
继续查找_W64。
从ULONG_PTR本身来看,应该是一个无符号long型指针。
U = unsigned
LONG = long
PTR = pointer
所以,ULONG_PTR就是 unsigned long *,GDI+中好像就是这么定义的。
Lactoferrin
2011-03-25
打赏
举报
回复
x64中unsigned long是32位的,因此用_w64报警
实际上有
#if defined(_WIN64)
typedef __int64 INT_PTR, *PINT_PTR;
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
typedef __int64 LONG_PTR, *PLONG_PTR;
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
#define __int3264 __int64
#else
typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
#define __int3264 __int32
#endif
#endif
x64下ULONG_PTR是64位的,x86下ULONG_PTR是32位的,目的就是保证和指针一样大
碎碎念
2011-03-25
打赏
举报
回复
[Quote=引用楼主 hhh_hao 的回复:]
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。
C/C++ code
typedef _W64 unsigned long ULONG_PTR
[/Quote]
ULONG_PTR表示64位无符号整形。。。通常用来存放64位地址。。。
Lactoferrin
2011-03-25
打赏
举报
回复
[Quote=引用 9 楼 hhh_hao 的回复:]
那就是说它还是个指针,它的值是地址,可以这样理解吗?
[/Quote]
ULONG_PTR是个整数型,能够保证它放得下地址,这个只是在c语言等区分整形和指针,用汇编就没区别了
龙行天下之Sky
2011-03-25
打赏
举报
回复
[Quote=引用 2 楼 zhh_steven 的回复:]
1. ULONG_PTR 只是专门用于内核程序 (Kernel 或 Device Driver) 使用的数据类型,
当作指针时它应当指向系统内核地址空间 (因此最高位为 1),另外它还可当作偏移量。
2.
定义:
ULONG_PTR
Unsigned LONG_PTR.
This type is declared in Basetsd.h as follows:
#i……
[/Quote]
从定义字面理解就是:unsigned long *类型
hhh_hao
2011-03-25
打赏
举报
回复
那就是说它还是个指针,它的值是地址,可以这样理解吗?
Lactoferrin
2011-03-25
打赏
举报
回复
[Quote=引用 7 楼 hhh_hao 的回复:]
引用 5 楼 lactoferrin 的回复:
ULONG_PTR就是能够装得下指针的无符号整数,
不是很明白这句话的意思,
[/Quote]
指针放的是地址,就是一个整数,有时需要让指针参与整数运算,但是c语言里面的指针不能直接算,就要用类型转换成整数类型再算
但是不同类型的计算机指针尺寸是不一样的,比如32位机中指针和unsigned long一样大,占4字节,64位机中和unsigned __int64一样大,占8字节
这样在针对32位的源代码和64位的源代码就不一样,如果用ULONG_PTR,就可以统一
vc6.0的扩展文件 part2
很多人在用vc6.0编译某些程序时总是出现错误。大多数情况可能是在使用directx8.0或者更新的版本时出现的,比如: d:\microsoft directx sdk (august 2008)\include\dsound.h(305) : error C2146: syntax error : missing ';' before identifier 'dwReserved1' d:\microsoft directx sdk (august 2008)\include\dsound.h(305) : error C2501: 'DWORD_
PTR
' : missing storage-class or type specifiers 等 实际上,就是因为dsound.h中使用了DWORD_
PTR
,而实际上没有此关键字的定义,所以在编译时出现了大量的错误。一些人建议自已定义此关键字: typedef U
LONG
DWORD_
PTR
实际上,这不是一种好的解决方案,因为除了这一个定义,可能还有很多其它的定义,也就是一系列的定义都需要你一个一个去做 经过对比,发现vc98/include/中的basetsd.h中没有DWORD_
PTR
的定义,但扩展的文件中的basetsd.h中却有定义,所以使用本文件把vc98/下的include和lib两个目录覆盖掉即可解决这些编译问题 由于无法上传大于10M的文件,所以分成了两部分
GDI+文件及使用方法
非常实用的GDI+文件,亲测可用 1.将GDI+.rar将其中的Includes和Lib中的文件拷到vc目录下的 Includes和Lib文件夹中,gdiplus.dll保存在windows/system32中; GDI+ for VC6.0 SDK下载地址: http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip 2.在你将要使用GDI+的工程中,完成初始化工作: 将以下代码加入StdAfx.h头文件中: //加入的头文件 #include //初始化一下com口 #ifndef U
LONG
_
PTR
#define U
LONG
_
PTR
unsigned
long
* #include "GdiPlus.h" using namespace Gdiplus; #endif //结束
GDI+VC配置工具
.下载(GDI+ for VC6.0 SDK)GDIPlus文件将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中. 下载地址:http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip(引用他人的) 2.在你将要使用GDI+的工程中,完成初始化工作: 在StdAfx.h中加入 #define U
LONG
_
PTR
unsigned
long
#include
using namespace Gdiplus; #include "GdiPlus.h" 3.在CApp头文件中加入 U
LONG
_
PTR
m_gdiplusToken; 4.在 BOOL C×App::InitInstance() 中添加 GdiplusStartupInput m_gdiplusStartupInput; GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL); 5.在int CXApp::ExitInstance()加入(这个方法需要自己加入 在ClassWizard 中,注意在ClassName中选择CXApp,Messages列表框中选择ExitInstance) GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); 6.在Project->stting->Link->Object/libary中加入gdiplus.lib 此时GDI+设置成功。
Windows Media Player 控件 For BCB
Windows Media Player 控件 For BCB,解决了 E2015 Ambiguity between 'U
LONG
_
PTR
' and 'Wmplib_tlb::U
LONG
_
PTR
' 的错误,可以安装在BCB6下,已经测试通过。里面有WMP.bpk,可以安装。
C语言实现COM组件
简单使用纯C语言实现COM组件,帮助理解COM实现机制
C++ 语言
65,180
社区成员
250,528
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章