最近头都搞大了,不管什么内存泄漏工具都检查不出来程序有问题。后来决定自己动手测试,找到的严重问题如下:
在win7、vista及以上系统中,调用WTSEnumerateProcesses函数后,使用传统的WTSFreeMemory来释放内存无用,此函数在WINXP以上系统中屁用都没有!!
后来在MDSN在线查找相关函数,发现了WTSFreeMemoryEx,使用此函数来释放内存就OK!
VC6中没有定义此函数,高版本应该是有的。所以如果用VC6的话,就得自己定义这个函数了。
代码如下:
//需定义参数的一个类型
typedef enum {
WTSTypeProcessInfoLevel0,
WTSTypeProcessInfoLevel1,
WTSTypeSessionInfoLevel1
} WTS_TYPE_CLASS;
//定义这个函数
typedef BOOL (WINAPI *myWTSFreeMemoryEx)(
WTS_TYPE_CLASS WTSTypeClass,
PVOID pMemory,
ULONG NumberOfEntries
//获取函数地址
HMODULE hWtsApi32 = LoadLibrary("wtsapi32.dll");
myWTSFreeMemoryEx pWTSFreeMemoryEx=(myWTSFreeMemoryEx)GetProcAddress(hWtsApi32,"WTSFreeMemoryExA");
//调用示例
WTS_PROCESS_INFO *pWtspi;
DWORD dwCount;
if(!WTSEnumerateProcesses(0, 0, 1, &pWtspi,&dwCount))
return 0;
WTSFreeMemory(pWtspi);
if (pWTSFreeMemoryEx != NULL) //直接这么判断就好了,如果未取得这个函数就代表是老系统,老系统也不存在这个问题
pWTSFreeMemoryEx(WTSTypeProcessInfoLevel0,pWtspi,dwCount);
此问题有朋友在国外论坛提问过,但无人回答,如需转载请留原链接吧!