VC中的#和##宏替换指令

宏替换中的#是把宏替换成字符串常量,比如:
例1:
#define MARK(name) printf(#name);
MARK(abc)被替换为 printf("abc");
例2:
#define MARK(name) printf(L#name);
MARK(abc)被替换为 printf(L"abc");

宏替换中的##是把自身前后的符号连接起来
例:
#define DECLAR_VAR(name) int prev_ ##  name;
DECLARE_VAR(abc)被替换为 int prev_abc;
显然这可以用来自动生成变量/函数的名字


一个典型的例子:
// 根据函数名称,获得导出函数的指针
void FindAndSetProcAddress()
{
    UNICODE_STRING funcName = {0};

#define SetProcAddress(function) /
    RtlInitUnicodeString(&funcName, L"Zw" L#function); /
    RealZw ## function = (Nt ## function ## _FuncPtr)MmGetSystemRoutineAddress(&funcName);

    SetProcAddress(CreateSection)
    // 上句会被替换为:
    // RtlInitUnicodeString(&funcName, L"Zw" L"CreateSection");
    // RealZwCreateSection = (NtCreateSection_FuncPtr)MmGetSystemRoutineAddress(&funcName);

    // 以下相同
    SetProcAddress(OpenKey)
    SetProcAddress(CreateKey)
    SetProcAddress(DeleteKey)
    SetProcAddress(DeleteValueKey)
    SetProcAddress(SetValueKey)

    SetProcAddress(CreateFile)
    SetProcAddress(DeleteFile)
    SetProcAddress(OpenFile)
    SetProcAddress(SetEaFile)
    SetProcAddress(SetInformationFile)
    SetProcAddress(WriteFile)

#undef SetProcAddress
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值