我正在尝试实施回答这个问题 https://stackoverflow.com/questions/11495227/how-can-i-monitor-a-file-asynchronously-in-firefox关于异步监视 Windows 文件系统。我在 ChomeWorker 中使用 js ctypes 作为 XULRunner 应用程序的一部分,但我认为如果我作为 Firefox 插件实现,这将是相同的。
作为任务的一部分,我尝试声明函数 ReadDirectoryChangesW 如下(基于我对 js ctypes 和MSDN 文档 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx).
const BOOL = ctypes.bool;
const DWORD = ctypes.uint32_t;
const LPDWORD = ctypes.uint32_t.ptr;
const HANDLE = ctypes.int32_t;
const LPVOID = ctypes.voidptr_t;
var library = self.library = ctypes.open("Kernel32.dll");
ReadDirectoryChangesW = library.declare(
"ReadDirectoryChangesW"
, ctypes.winapi_abi
, BOOL // return type
, HANDLE // hDirectory
, LPVOID // lpBuffer
, DWORD // nBufferLength
, BOOL // bWatchSubtree
, DWORD // dwNotifyFilter
, LPDWORD // lpBytesReturned
);
另外(这里没有介绍),我已经声明了函数映射FindFirstChangeNotification()
and WaitForSingleObject()
这似乎工作正常。
我遇到的问题是,当文件系统事件发生时,我不知道应该将什么传递给 lpBuffer 参数,也不知道如何解释结果。
所有 C++ 示例似乎都使用DWORD
数组,然后输出结果。我的尝试如下:
const DWORD_ARRAY = new ctypes.ArrayType(DWORD);
var lBuffer = new DWORD_ARRAY(4000);
var lBufferSize = DWORD.size * 4000;
var lBytesOut = new LPDWORD();
ReadDirectoryChangesW(lHandle, lBuffer.address(), lBufferSize, true, WATCH_ALL, lBytesOut)
这似乎每次都会使 XULRunner 崩溃。
任何人都可以建议我应该为 lpBuffer 参数传递什么和/或如何从ReadDirectoryChangesW()
?我在网上能找到的只是 C++ 示例,但它们没有太多帮助。谢谢。