这宏,我写的,怎么看怎么顺眼,能用宏,为什么要写函数呢,费事不讨好,而且还有可能影响效率

不过,实话实说,看着是有点low。。。

 

如果Windows的编译器能支持gcc的那种 ({}) ,的话,这个宏我能写得更完美,

就不用像最后,还得单独一行写宏,然后再起一行if __ret 了,

那样的话,代码会更好看。

 

其实,这样写还可能出现另一个问题,就是类型不兼容的警告,

这需要 typeof 关键字来解决,但是。我上哪找去。

 

 1 //    判断 __src 的长度 __srcLen 是否小于 __dstLen ,如果是的话,
 2 //    那么就用 __memType 和 __tag 重新申请一块内存,否则不动,
 3 //    不动、重新申请成功,__ret 返回 1
 4 //    申请失败,__ret 返回 0
 5 //    原始地址指针PP,原始内存长度PD,目标长度DW,内存页属性DW,TAG,返回值PD
 6 #define ComperMemoryAlloc(__src, __srcLen, __dstLen, __memType, __tag, __ret)            \
 7     do {                                                                                \
 8         LPVOID pv = NULL;                                                                \
 9         *(__ret) = 1;                                                                    \
10         if (*(__srcLen) < (__dstLen))                                                    \
11         {                                                                                \
12             pv = ExAllocatePoolWithTag((__memType), (__dstLen), (__tag));                \
13             if (pv)                                                                        \
14             {                                                                            \
15                 ExFreePoolWithTag(*(__src), (__tag));                                    \
16                 *(__srcLen) = (__dstLen);                                                \
17                 *(__src) = pv;                                                            \
18                 *(__ret) = 1;                                                            \
19             }                                                                            \
20             else                                                                        \
21             {                                                                            \
22                 *(__ret) = 0;                                                            \
23             }                                                                            \
24         }                                                                                \
25     } while (0)

 

不过,至于使用方法。。。

有点自己给自己找罪受的感觉

 1     DWORD dwRet = 0;
 2     ComperMemoryAlloc(&p, &dwLen, 200, NULL, 0, &dwRet);
 3     if (dwRet)
 4     {
 5 
 6     }
 7     else
 8     {
 9 
10     }