日期:2009-10-13
分类:General
函数:
EnumDirTree:搜索指定路径下的同名文件,可以递归子目录
EnumDirTreeProc:用于上述函数中的一个回调,用于处理一些用户自定义的特殊操作
――――――――下面是代码和注释――――――――――――――――――――
#include "stdafx.h"
#include <Windows.h>
#include <dbghelp.h>
#pragma comment(lib,"dbghelp")
BOOL CALLBACK EnumDirTreeProc(LPCTSTR FilePath,PVOID CallerData)
{
printf("%s,%s/n",FilePath,CallerData);
return FALSE;
/*
2个参数都是由EnumDirTree传进来的
FilePath是第一次找到的全路径
CallerData是EnumDirTree的最后一个参数
用来作为在回调中所需的信息,比如可以用做比较之类的
返回false则可以继续搜索,否则就stop了
*/
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD error;
HANDLE hProcess;
SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
hProcess = GetCurrentProcess();
if (SymInitialize(hProcess, NULL, TRUE))
{
// SymInitialize returned success
/*
BOOL WINAPI EnumDirTree( 搜索文件并返回路径
__in_opt HANDLE hProcess,
__in PCTSTR RootPath, 开始搜索的路径
__in PCTSTR InputPathName, 被搜索文件名
__out LPTSTR OutputPathBuffer, 被填充的全路径
__in PENUMDIRTREE_CALLBACK Callback, 回调函数
__in PVOID CallbackData 回调函数用的到上下文
);
BOOL CALLBACK EnumDirTreeProc(
[in] LPCTSTR FilePath,
[in] PVOID CallerData
);
*/
char buf[MAX_PATH];
buf[0] = _T('/0');
char bufP[] = _T("lib");
if(FALSE == EnumDirTree(hProcess,"E://crash","dbghelp.lib",buf,EnumDirTreeProc,(PVOID)bufP))
{
// 这里会打印,因为上面的回调是返回false的
printf("EnumDirTree returned error : %d/n", GetLastError());
}
}
else
{
// SymInitialize failed
printf("SymInitialize returned error : %d/n", GetLastError());
}
system("pause");
return 0;
}
Remarks
The search can be canceled if you register a SymRegisterCallbackProc64 callback function. For every file operation, EnumDirTree calls this callback function with CBA_DEFERRED_SYMBOL_LOAD_CANCEL. If the callback function returns TRUE, EnumDirTree cancels the search.
这段英文没看明白到底SymRegisterCallbackProc64跟这个有什么关系