typedef  BOOL(_cdecl*filepoint)(HANDLE,LPVOID,DWORD,BOOL,DWORD,LPDWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE);
filepoint fpt;HMODULE hmd = LoadLibrary("Kernel32.dll");fpt = (filepoint)GetProcAddress(hmd,_T("ReadDirectoryChangesW")); FILE_NOTIFY_INFORMATION Buffer[20]; HANDLE hand;hand = CreateFile("D:\\Dropbox",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
int i = GetLastError();
DWORD BytesReturned;
int ret;fpt(hand,&Buffer,sizeof(Buffer),TRUE,
FILE_NOTIFY_CHANGE_SIZE| FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_DIR_NAME| FILE_NOTIFY_CHANGE_FILE_NAME,
&BytesReturned,NULL,NULL);int i = 256;
想做个文件监视的,我是把这段程序放在MFC的Timer函数中,为什么执行不到int i = 256这句呢,而且执行fpt函数老报错,是不是动态库函数没有加装成功啊,但指针又不为空啊

解决方案 »

  1.   

    GetLastError(); 先把错误给大家附上吧!
      

  2.   

    CreateFile Return Values
    An open handle to the specified file indicates success. If the specified file exists before the function call and dwCreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even though the function has succeeded. If the file does not exist before the call, GetLastError returns zero. INVALID_HANDLE_VALUE indicates failure. To get extended error information, call GetLastError. 
    返回值是5啊,好像没有错吧
      

  3.   

    代码发的有问题int i = GetLastError();
    ...
    int i = 256;
    这样的代码编得过么??
      

  4.   

    哦,不好意思,拷贝过来的代码,这个地方为了说明不能运行到这行,随便写了一行代码,造成重复定义搞错了,我这只是说明代码不能运行到int i=256这行,能帮我解一下吗?我的目的是调用函数文件监控函数ReadDirectoryChangesW,
    用隐式链接改了#define _WIN32_WINNT 0x0500还是不行,所以用显示调用,但这里不知为什么老错,一执行fpt()函数立即返回不执行后面的语句啦
      

  5.   

    那应该是你的ftp函数里出现异常了,被外层给catch走了,所以走不到下边
      

  6.   

    监视文件操作是这样写滴。拿回去参考吧。
    #include <windows.h>
    #include <iostream.h>
    #include <conio.h>#define MAX_BUFFER 4096typedef struct _PER_IO_CONTEXT
    {
    OVERLAPPED              ol;
    HANDLE                     hDir;
    CHAR        lpBuffer[MAX_BUFFER];
    _PER_IO_CONTEXT*           pNext; 
    }PER_IO_CONTEXT, *PPER_IO_CONTEXT;PPER_IO_CONTEXT g_pIContext;typedef BOOL (WINAPI *lpReadDirectoryChangesW)( HANDLE,
       LPVOID,
       DWORD,
       BOOL,
       DWORD,
       LPDWORD,
       LPOVERLAPPED,
       LPOVERLAPPED_COMPLETION_ROUTINE);lpReadDirectoryChangesW ReadDirectoryChangesW = NULL;HANDLE g_hIocp;
    HANDLE g_hDir;DWORD WINAPI CompletionRoutine(LPVOID lpParam);
    void FileActionRoutine(PFILE_NOTIFY_INFORMATION pfi);
    TCHAR szDirectory[] = "F:\\";void main()
    {
    HANDLE hRet;
    HANDLE hThread;

    g_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
    if (NULL == g_hIocp)
    {
    cout <<"CreateIoCompletionPort Failed: " <<GetLastError() <<endl;
    return;
    }
    cout <<"monitor directory is: " <<szDirectory <<endl;
    g_hDir = CreateFile( szDirectory,
    FILE_LIST_DIRECTORY,
    FILE_SHARE_READ|
    FILE_SHARE_WRITE|
    FILE_SHARE_DELETE,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS|
    FILE_FLAG_OVERLAPPED,
    NULL);
    if (NULL == g_hDir)
    {
    cout <<"CreateFile Failed: " <<GetLastError() <<endl;
    CloseHandle(g_hIocp);
    return;
    }

    HINSTANCE hInst = LoadLibrary("Kernel32.DLL"); 
    if(!hInst)

    cout <<"LoadLibrary Failed: " <<GetLastError() <<endl;
    CloseHandle(g_hIocp);
    CloseHandle(g_hDir);
    return;
    }

    ReadDirectoryChangesW = (lpReadDirectoryChangesW)GetProcAddress(hInst, "ReadDirectoryChangesW");
    FreeLibrary(hInst); 

    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    for (int i=0; i<(int)SysInfo.dwNumberOfProcessors; i++)
    {
    hThread = CreateThread(NULL, 0, CompletionRoutine, NULL, 0, NULL);
    if(NULL == hThread)
    {
    cout <<"CreateThread Failed: " <<GetLastError() <<endl;
    CloseHandle(g_hIocp);
    CloseHandle(g_hDir);
    return;
    }
    CloseHandle(hThread);
    }

    g_pIContext = (PPER_IO_CONTEXT)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PER_IO_CONTEXT));
    if(NULL == g_pIContext)
    {
    cout <<"HeapAlloc Failed: " <<GetLastError() <<endl;
    PostQueuedCompletionStatus(g_hIocp, 0, NULL, NULL);
    CloseHandle(g_hIocp);
    CloseHandle(g_hDir);
    return;
    }
    g_pIContext->hDir = g_hDir;
    ZeroMemory(&(g_pIContext->ol), sizeof(OVERLAPPED));
    ZeroMemory(g_pIContext->lpBuffer, MAX_BUFFER);
    g_pIContext->pNext = NULL;

    hRet = CreateIoCompletionPort(g_hDir, g_hIocp, (ULONG_PTR)g_pIContext, 0);
    if(NULL == hRet)
    {
    cout <<"CreateIoCompletionPort Failed: " <<GetLastError() <<endl;
    PostQueuedCompletionStatus(g_hIocp, 0, NULL, NULL);
    CloseHandle(g_hIocp);
    CloseHandle(g_hDir);
    HeapFree(GetProcessHeap(), 0, g_pIContext);
    return;
    }

    DWORD nBytes = 0;
    BOOL bRet = FALSE;

    bRet = ReadDirectoryChangesW(g_pIContext->hDir,
    g_pIContext->lpBuffer,
    MAX_BUFFER,
    TRUE,
    FILE_NOTIFY_CHANGE_FILE_NAME | 
    //FILE_NOTIFY_CHANGE_DIR_NAME | 
    FILE_NOTIFY_CHANGE_ATTRIBUTES | 
    FILE_NOTIFY_CHANGE_SIZE,
    //FILE_NOTIFY_CHANGE_LAST_ACCESS | 
    //FILE_NOTIFY_CHANGE_CREATION | 
    //FILE_NOTIFY_CHANGE_SECURITY | 
    //FILE_NOTIFY_CHANGE_LAST_WRITE,
    &nBytes,
    &(g_pIContext->ol),
    NULL);
    if(!bRet)
    {
    cout <<"ReadDirectoryChangesW Failed: " <<GetLastError() <<endl;
    PostQueuedCompletionStatus(g_hIocp, 0, NULL, NULL);
    CloseHandle(g_hIocp);
    CloseHandle(g_hDir);
    HeapFree(GetProcessHeap(), 0, g_pIContext);
    return;
    }
    cout<<"OK"<<endl;
    cout <<"Enter q to exit: " <<endl;
        while(getch() != 'q');
        
    PostQueuedCompletionStatus(g_hIocp, 0, NULL, NULL);
    CloseHandle(g_hIocp);
    CloseHandle(g_hDir);
    HeapFree(GetProcessHeap(), 0, g_pIContext);
    cout <<"Main thread will exit " <<endl;
    getch();
    }DWORD WINAPI CompletionRoutine(LPVOID lpParam)
    {
    DWORD dwBytes;
    PPER_IO_CONTEXT pIContext = NULL;
    LPOVERLAPPED pOL = NULL;
    PFILE_NOTIFY_INFORMATION pfi = NULL;
    BOOL bRet;
    DWORD cbOffset;
    DWORD nBytes;
    while(true)
    {
    bRet = GetQueuedCompletionStatus(g_hIocp, &dwBytes,(PULONG_PTR )&pIContext, &pOL, INFINITE);

    if(bRet)
    {
    if(NULL == pIContext)
    {
    cout <<"CompletionRoutine thread exit " <<endl;
    return 0;
    }

    pfi = (PFILE_NOTIFY_INFORMATION)pIContext->lpBuffer;

    do
    {
    try
    {
    switch(pfi->Action)
    {
    case FILE_ACTION_ADDED: 
    cout <<"FILE_ACTION_ADDED: ";
    FileActionRoutine(pfi);
    break;
    case FILE_ACTION_REMOVED:
    cout <<"FILE_ACTION_REMOVED: ";
    FileActionRoutine(pfi);
    break;
    case FILE_ACTION_MODIFIED: 
    cout <<"FILE_ACTION_MODIFIED: ";
    FileActionRoutine(pfi);
    break;
    case FILE_ACTION_RENAMED_OLD_NAME: 
    cout <<"FILE_ACTION_RENAMED_OLD_NAME: ";
    FileActionRoutine(pfi);
    break;
    case FILE_ACTION_RENAMED_NEW_NAME:
    cout <<"FILE_ACTION_RENAMED_NEW_NAME: ";
    FileActionRoutine(pfi);
    break;
    default:
    break;

    }
    cbOffset = pfi->NextEntryOffset;
    pfi = (PFILE_NOTIFY_INFORMATION)((LPBYTE) pfi + cbOffset);
    }
    catch(...)

    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
    );
    cout <<"CompletionRoutine Exception = " <<lpMsgBuf <<endl;
    LocalFree(lpMsgBuf);
    }
    }while(cbOffset);
    }

    g_pIContext->hDir = g_hDir;
    ZeroMemory(&(g_pIContext->ol), sizeof(OVERLAPPED));
    ZeroMemory(g_pIContext->lpBuffer, MAX_BUFFER);
    g_pIContext->pNext = NULL;

    nBytes = 0;
    bRet = FALSE;

    bRet = ReadDirectoryChangesW(g_pIContext->hDir,
    g_pIContext->lpBuffer,
    MAX_BUFFER,
    TRUE,
    FILE_NOTIFY_CHANGE_FILE_NAME | 
    //FILE_NOTIFY_CHANGE_DIR_NAME | 
    //FILE_NOTIFY_CHANGE_ATTRIBUTES | 
    FILE_NOTIFY_CHANGE_SIZE, 
    //FILE_NOTIFY_CHANGE_LAST_ACCESS | 
    //FILE_NOTIFY_CHANGE_CREATION | 
    //FILE_NOTIFY_CHANGE_SECURITY | 
    //FILE_NOTIFY_CHANGE_LAST_WRITE,
    &nBytes,
    &(g_pIContext->ol),
    NULL);
    if(!bRet)
    {
    cout <<"ReadDirectoryChangesW Failed: " <<GetLastError() <<endl;
    return 0;
    }
    }
    }void FileActionRoutine(PFILE_NOTIFY_INFORMATION pfi)
    {
        TCHAR szFileName[MAX_PATH];
        memset(szFileName,'\0',sizeof(szFileName));
        WideCharToMultiByte(CP_ACP, 
    0,
    pfi->FileName,    
    pfi->FileNameLength/2,
    szFileName,     
    MAX_PATH,
    NULL,
    NULL);
        cout <<szFileName <<endl;
    }
      

  7.   

    你这个贴http://topic.csdn.net/u/20100520/15/5c19009e-541a-474b-bb97-e217bbfac1fc.html怎么不满意结贴了,我还准备回答下的呢下次记住了,别轻易无满意结贴