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函数老报错,是不是动态库函数没有加装成功啊,但指针又不为空啊
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函数老报错,是不是动态库函数没有加装成功啊,但指针又不为空啊
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啊,好像没有错吧
...
int i = 256;
这样的代码编得过么??
用隐式链接改了#define _WIN32_WINNT 0x0500还是不行,所以用显示调用,但这里不知为什么老错,一执行fpt()函数立即返回不执行后面的语句啦
#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;
}