ReadDirectoryChangesW函数不能被编译 ReadDirectoryChangesW函数不能被编译,ReadDirectoryChangesW在winbase.h文件中,我都包含了,但还是不能被识别而且也加下面这句。#define _WIN32_WINNT 0x0500 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Unicode: Implemented only as Unicode.只能在UNICODE下使用 在project->setting菜单的c/c++页的general中的Preprocessor definitions项中增加_UNICODE试试 在setting->C/C++中加上_WIN32_WINNT=0x0500,WINVER=0x0500 Implemented only as Unicode. 在project->setting菜单的c/c++页的general中的Preprocessor definitions项中增加_UNICODE试试我加了,还是不行。 安装的时候要选择Unicode支持,或者到别人那拷MFC42U.dll等看看 去掉结尾的W呢?一般不要直接调用区分编码的API,而是由编译器解决。 还是不行, 我看到一个例子,在consle程序中是可以的,而在我的MFC程序却不行。 #include "StdAfx.h"#include "FileSystemWatcher.h"#define OUTSDKERRO() {LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf );}bool FileSystemWatcher::Run( std::string path, LPDEALFUNCTION dealfun ){WatchedDir = path;DealFun = dealfun;DWORD ThreadId;hThread=CreateThread( NULL,0,Routine,this,0,&ThreadId );if(NULL==hThread)OUTSDKERRO();return NULL!=hThread;}void FileSystemWatcher::Close(){ if( NULL != hThread ) { ExitFlag=true; } if( INVALID_HANDLE_VALUE != hDir ) { CloseHandle( hDir ); hDir = INVALID_HANDLE_VALUE; }}FileSystemWatcher::FileSystemWatcher() : DealFun(NULL), hThread(NULL), hDir(INVALID_HANDLE_VALUE),ExitFlag(false){ }FileSystemWatcher::~FileSystemWatcher(){Close();}DWORD WINAPI FileSystemWatcher::Routine( LPVOID lParam ){ FileSystemWatcher* obj = (FileSystemWatcher*)lParam; obj->hDir = CreateFile( obj->WatchedDir.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if( INVALID_HANDLE_VALUE == obj->hDir ) {OUTSDKERRO();return false;} char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ]; FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf; DWORD BytesReturned; while(true) { if( ReadDirectoryChangesW( obj->hDir, pNotify, sizeof(buf), true, FILE_NOTIFY_CHANGE_FILE_NAME| FILE_NOTIFY_CHANGE_DIR_NAME| FILE_NOTIFY_CHANGE_ATTRIBUTES| FILE_NOTIFY_CHANGE_SIZE| FILE_NOTIFY_CHANGE_LAST_WRITE| FILE_NOTIFY_CHANGE_LAST_ACCESS| FILE_NOTIFY_CHANGE_CREATION| FILE_NOTIFY_CHANGE_SECURITY, &BytesReturned, NULL, NULL ) ) { char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH]; memset( tmp, 0, sizeof(tmp) ); WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL ); strcpy( str1, tmp ); if( 0 != pNotify->NextEntryOffset ) { PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset); memset( tmp, 0, sizeof(tmp) ); WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL ); strcpy( str2, tmp ); } obj->DealFun( (ACTION)pNotify->Action, str1, str2 ); if(obj->ExitFlag)break; } else { OUTSDKERRO(); break; } } return 0;} /*监测目录活动 百特门技术网 2004-09-16 20:49:55 C# 中有类 FileSystemWatcher 不但能够知道指定目录树中的文件/目录的改变,而且能够知道是哪个文件/目录在改变,而我用FindFirstChangeNotification等Win API 却不能实现第二个功能,虚耗了不少时间,昨日在msdn中发现 ReadDirectoryChangesW 是可行的,特封装一下,请大家斧正。*/// 名称: FileSystemWatcher// 功能: 监测指定目录中的文件/目录的改变// 环境要求: Requires Windows NT 3.51 SP3 or later, and Unsupported Windows 95/98.// 版权申明: 可任意拷贝、修改、发布// 作者: 周星星// 日期: 2003-08-07// 说明: 未做测试//修改: 方俊海 //日期:2005-12-01#define _WIN32_WINNT 0x0500enum ACTION { ADDED=1, REMOVED=2, MODIFIED=3, RENAMED=4 };class FileSystemWatcher{public:typedef void (__stdcall *LPDEALFUNCTION)( ACTION act, std::string filename1, std::string filename2 );bool Run( std::string path, LPDEALFUNCTION dealfun );void Close();FileSystemWatcher();// : DealFun(NULL), hThread(NULL), hDir(INVALID_HANDLE_VALUE);~FileSystemWatcher();private:std::string WatchedDir;LPDEALFUNCTION DealFun;HANDLE hThread;HANDLE hDir;private:FileSystemWatcher( const FileSystemWatcher& );FileSystemWatcher operator=( const FileSystemWatcher );private:static DWORD WINAPI Routine( LPVOID lParam );bool ExitFlag;}; 这个函数只支持Unicode,还有Windows版本设置。 Unicod还有Windows版本设置我都做了还是不行 试试动态链接。GetModuleHandle("Kernel32.DLL")GetProcAddress("ReadDirectoryChangesW") 请问everandforever(Forever)具体怎么用?能给我一个例子吗? 在Stdafx.h里加#define WINVER 0x0500 呵呵,需要在Stdafx.h里加#define _WIN32_WINNT 0x0500winbase.h里的定义是这样的#if(_WIN32_WINNT >= 0x0400)WINBASEAPIBOOLWINAPIReadDirectoryChangesW( HANDLE hDirectory, LPVOID lpBuffer, DWORD nBufferLength, BOOL bWatchSubtree, DWORD dwNotifyFilter, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );#endif /* _WIN32_WINNT >= 0x0400 */WINBASEAPI 把#define _WIN32_WINNT 0x0500放在stdafx.h的#include <afxwin.h>的前面 程序启动默认最大化//窗口偏移了什么情况???? 在单文档中通过增加一个View来实现单文档多View时遇到的一个问题 VC6创建和删除自定义工程 怎样显示连接使用一个dll 求摄像机标定的计算方法资料! 请问Create和WM_CREATE有什么区别 初学者问题:如何隐藏和显示主页面上的label和Edit控件? win32SDK有哪些个绘画方式呢! 做一个透明窗体,只是让窗体内部透明,而窗体的边框可以设置颜色、粗细,如何实现? 截取任务栏图像的问题 网页中调用VC函数问题 菜单
只能在UNICODE下使用
中加上_WIN32_WINNT=0x0500,WINVER=0x0500
#include "FileSystemWatcher.h"
#define OUTSDKERRO() {LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf );}bool FileSystemWatcher::Run( std::string path, LPDEALFUNCTION dealfun )
{
WatchedDir = path;
DealFun = dealfun;DWORD ThreadId;
hThread=CreateThread( NULL,0,Routine,this,0,&ThreadId );
if(NULL==hThread)OUTSDKERRO();
return NULL!=hThread;
}
void FileSystemWatcher::Close()
{
if( NULL != hThread )
{
ExitFlag=true;
}
if( INVALID_HANDLE_VALUE != hDir )
{
CloseHandle( hDir );
hDir = INVALID_HANDLE_VALUE;
}
}
FileSystemWatcher::FileSystemWatcher() : DealFun(NULL), hThread(NULL), hDir(INVALID_HANDLE_VALUE),ExitFlag(false)
{
}FileSystemWatcher::~FileSystemWatcher()
{
Close();
}
DWORD WINAPI FileSystemWatcher::Routine( LPVOID lParam )
{
FileSystemWatcher* obj = (FileSystemWatcher*)lParam;
obj->hDir = CreateFile(
obj->WatchedDir.c_str(),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if( INVALID_HANDLE_VALUE == obj->hDir ) {OUTSDKERRO();return false;}
char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf;
DWORD BytesReturned;
while(true)
{
if( ReadDirectoryChangesW( obj->hDir,
pNotify,
sizeof(buf),
true,
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_SECURITY,
&BytesReturned,
NULL,
NULL ) )
{
char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str1, tmp );
if( 0 != pNotify->NextEntryOffset )
{
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str2, tmp );
}
obj->DealFun( (ACTION)pNotify->Action, str1, str2 );
if(obj->ExitFlag)break;
}
else
{
OUTSDKERRO();
break;
}
}
return 0;
}
百特门技术网 2004-09-16 20:49:55
C# 中有类 FileSystemWatcher 不但能够知道指定目录树中的文件/目录的改变,而且能够知道是哪个文件/目录在改变,而我用FindFirstChangeNotification等Win API 却不能实现第二个功能,虚耗了不少时间,昨日在msdn中发现 ReadDirectoryChangesW 是可行的,特封装一下,请大家斧正。*/// 名称: FileSystemWatcher
// 功能: 监测指定目录中的文件/目录的改变
// 环境要求: Requires Windows NT 3.51 SP3 or later, and Unsupported Windows 95/98.
// 版权申明: 可任意拷贝、修改、发布
// 作者: 周星星
// 日期: 2003-08-07
// 说明: 未做测试
//修改: 方俊海
//日期:2005-12-01
#define _WIN32_WINNT 0x0500
enum ACTION { ADDED=1, REMOVED=2, MODIFIED=3, RENAMED=4 };
class FileSystemWatcher
{
public:
typedef void (__stdcall *LPDEALFUNCTION)( ACTION act, std::string filename1, std::string filename2 );bool Run( std::string path, LPDEALFUNCTION dealfun );
void Close();
FileSystemWatcher();// : DealFun(NULL), hThread(NULL), hDir(INVALID_HANDLE_VALUE);
~FileSystemWatcher();private:
std::string WatchedDir;
LPDEALFUNCTION DealFun;
HANDLE hThread;
HANDLE hDir;
private:
FileSystemWatcher( const FileSystemWatcher& );
FileSystemWatcher operator=( const FileSystemWatcher );
private:
static DWORD WINAPI Routine( LPVOID lParam );bool ExitFlag;
};
GetModuleHandle("Kernel32.DLL")
GetProcAddress("ReadDirectoryChangesW")
具体怎么用?能给我一个例子吗?
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500winbase.h里的定义是这样的#if(_WIN32_WINNT >= 0x0400)
WINBASEAPI
BOOL
WINAPI
ReadDirectoryChangesW(
HANDLE hDirectory,
LPVOID lpBuffer,
DWORD nBufferLength,
BOOL bWatchSubtree,
DWORD dwNotifyFilter,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
#endif /* _WIN32_WINNT >= 0x0400 */WINBASEAPI