ReadDirectoryChangesW函数不能被编译,ReadDirectoryChangesW在winbase.h文件中,我都包含了,
但还是不能被识别而且也加下面这句。#define _WIN32_WINNT 0x0500

解决方案 »

  1.   

    Unicode: Implemented only as Unicode.
    只能在UNICODE下使用
      

  2.   

    在project->setting菜单的c/c++页的general中的Preprocessor definitions项中增加_UNICODE试试
      

  3.   

    在setting->C/C++
    中加上_WIN32_WINNT=0x0500,WINVER=0x0500
      

  4.   

    Implemented only as Unicode.
      

  5.   

    在project->setting菜单的c/c++页的general中的Preprocessor definitions项中增加_UNICODE试试我加了,还是不行。
      

  6.   

    安装的时候要选择Unicode支持,或者到别人那拷MFC42U.dll等看看
      

  7.   

    去掉结尾的W呢?一般不要直接调用区分编码的API,而是由编译器解决。
      

  8.   

    还是不行, 我看到一个例子,在consle程序中是可以的,而在我的MFC程序却不行。
      

  9.   

    #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;
    }
      

  10.   

    /*监测目录活动 
    百特门技术网 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;
    };
      

  11.   

    这个函数只支持Unicode,还有Windows版本设置。
      

  12.   

    Unicod还有Windows版本设置我都做了还是不行
      

  13.   

    试试动态链接。
    GetModuleHandle("Kernel32.DLL")
    GetProcAddress("ReadDirectoryChangesW")
      

  14.   

    请问everandforever(Forever)
    具体怎么用?能给我一个例子吗?
      

  15.   

    在Stdafx.h里加
    #define WINVER 0x0500
      

  16.   

    呵呵,需要在Stdafx.h里加
    #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
      

  17.   

    把#define _WIN32_WINNT 0x0500放在stdafx.h的#include <afxwin.h>的前面