如何快速知道windowsAPI函数调用时,某些参数所对应的十进制或十六进制值

效率源科技 2018-04-08 09:49:09
比如OpenProcessToken这个函数,它的第二参数是DesiredAccess,有如下可选值:


问题是:MSDN上找到的是对应的文字描述,我想知道这些值对应的十进制或十六进制值,有哪些方法可以实现呢?
...全文
541 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyefangzhou24 2018-04-11
  • 打赏
  • 举报
回复
直接 DWORD test = TOKEN_WRITE; printf("%d" , test );
赵4老师 2018-04-09
  • 打赏
  • 举报
回复
还有一个办法就是运行或单步执行这句:
printf("%s %d 0x%08X","TOKEN_ADJUST_DEFAULT",TOKEN_ADJUST_DEFAULT,TOKEN_ADJUST_DEFAULT);
「已注销」 2018-04-09
  • 打赏
  • 举报
回复
如果是 Windows 系统,首先保证你有安装 Everything,能够秒搜文件。 如果你已经安装了 VS 那么很简单,直接转到定义就可以了。如果你安装了,但不想为了这么一个功能打开 VS,MSDN 页面底部会有 Headers 字样指明这些函数声明或宏定义在哪个头文件里面,如果没有,就在对应的 API 页面底部。直接去 Everything 里面搜索这个文件,最好用 Notepad2、Notepad++ 或其他高级的文本编辑器打开这个头文件,在文件中直接搜索其中一个宏名称关键字。 如果你没有安装 VS 也不想安装,只是为了查找这些宏定义,你可以直接下载 Windows 的头文件: https://sourceforge.net/projects/mingw/files/MinGW/Base/w32api 去这里下载最新的。这是开源 GCC 的 Windows 版 MinGW 的其中一个组件。如果你就是想要微软的版本,那么你最好还是去别人的 VS 目录中拷贝一份出来。 如果不是 Windows 系统,Everything 是肯定用不了了。可以用 find 命令来查找这个关键字: find ./dir -name "*.h" -print0 | xargs -0 -n 1 grep "TOKEN_ADJUST_DEFAULT" 前面 ./dir 就是查找的起始路径。
赵4老师 2018-04-09
  • 打赏
  • 举报
回复
引用 7 楼 SXJIAKE 的回复:
#define PRINT_MACRO(_m) printf("%s %d 0x%08X\n", #_m, _m, _m);
英雄所见略同。 因为写这句话的时候,我想起我经常灌的这杯水:
#与##在宏定义中的--宏展开
#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
int main()
{
        printf("%s\n", h(f(1,2)));   // 12
        printf("%s\n", g(f(1,2))); // f(1,2)
        return 0;
}
宏展开时:
如果宏定义以#开头,不展开参数,直接替换。
故g(f(1,2))--->#f(1,2)--->"f(1,2)";
如果宏定义不以#开头,展开参数,直接替换,由外层向里层,如果碰到的是#开头的宏,不继续往里层展开,往外层展开。
由外层向里层,如果碰到的是以非#开头的宏,继续往里层走,直至最里层,开始一层层往外层展开。
故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。
PS:
##在宏中定义,是字符连接符
如a##b##c 等同于 "abc"
#在宏开头出现,是表示宏展开的方式不同
#a 等同于"a"
#abc 等同于 "abc"
复杂的:
#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
int main()
{
        char a = 'a';
        cout<<g(a)<<endl; // a
        cout<<g(g(a))<<endl; // a
        printf("%s\n", h(f(1,2)));   // 12
        printf("%s\n", g(f(1,2))); // f(1,2)
        printf("%s\n", g(h(f(1,2)))); // h(f(1,2))
        printf("%s\n", h(g(f(1,2)))); // "f(1,2)"
        printf("%s\n", h(h(f(1,2)))); // "12"
        system("pause");
        return 0;
}
预处理后的:(在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E)
int main()
{
        char a = 'a';
        cout<<"a"<<endl;
        cout<<"g(a)"<<endl;
        printf("%s\n", "12");
        printf("%s\n", "f(1,2)");
        printf("%s\n", "h(f(1,2))");
        printf("%s\n", "\"f(1,2)\"");
        printf("%s\n", "\"12\"");
        system("pause");
        return 0;
}
---------------------------------------------------
宏解析
1.       ##操作符
##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号,它不能出现于宏替代表的开端和末尾。
例:
#define concat(s,t) s##t
#define AAA ABC
concat(A, AA)
将被替换成
ABC
2.       重新扫描和替换
在替换列表中的所有参数替换过之后,预处理器将对结果token序列重新扫描以便对其中的宏再次替换。
当正在替换的宏在其替换列表中发现自身时,就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换(防止递归)。
例:
#define ROOT AAA CCC
#define AAA ROOT
ROOT
将被替换成
ROOT CCC
「已注销」 2018-04-09
  • 打赏
  • 举报
回复
#define PRINT_MACRO(_m) printf("%s %d 0x%08X\n", #_m, _m, _m);
效率源科技 2018-04-08
  • 打赏
  • 举报
回复
嗯,除了用VS的转到定义,还有其他方法吗?
赵4老师 2018-04-08
  • 打赏
  • 举报
回复
VS IDE中,在不明白的符号上点鼠标右键,选转到定义。
jiht594 2018-04-08
  • 打赏
  • 举报
回复
代码写好之后、定位到定义,就可以看到具体值了。 这些值大多数情况不需要查看。不同版本、对应的值也不一定一样。
赵4老师 2018-04-08
  • 打赏
  • 举报
回复
引用 3 楼 u013552798 的回复:
嗯,除了用VS的转到定义,还有其他方法吗?
C:\>findstr /? 在文件中寻找字符串。 FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]] /B 在一行的开始配对模式。 /E 在一行的结尾配对模式。 /L 按字使用搜索字符串。 /R 将搜索字符串作为一般表达式使用。 /S 在当前目录和所有子目录中搜索匹配文件。 /I 指定搜索不分大小写。 /X 打印完全匹配的行。 /V 只打印不包含匹配的行。 /N 在匹配的每行前打印行数。 /M 如果文件含有匹配项,只打印其文件名。 /O 在每个匹配行前打印字符偏移量。 /P 忽略有不可打印字符的文件。 /OFF[LINE] 不跳过带有脱机属性集的文件。 /A:attr 指定有十六进位数字的颜色属性。请见 "color /?" /F:file 从指定文件读文件列表 (/ 代表控制台)。 /C:string 使用指定字符串作为文字搜索字符串。 /G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。 /D:dir 查找以分号为分隔符的目录列表 strings 要查找的文字。 [drive:][path]filename 指定要查找的文件。 除非参数有 /C 前缀,请使用空格隔开搜索字符串。 例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或 "there"。'FINDSTR /C:"hello there" x.y' 文件 x.y 寻找 "hello there"。 一般表达式的快速参考: . 通配符: 任何字符 * 重复: 以前字符或类别出现零或零以上次数 ^ 行位置: 行的开始 $ 行位置: 行的终点 [class] 字符类别: 任何在字符集中的字符 [^class] 补字符类别: 任何不在字符集中的字符 [x-y] 范围: 在指定范围内的任何字符 \x Escape: 元字符 x 的文字用法 \<xyz 字位置: 字的开始 xyz\> 字位置: 字的结束 有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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