2016-03-20 32 views
1

我想让ReadFileEx在js-ctypes中工作,并遇到了将OVERLAPPED结构转换为js-ctypes的障碍。在翻译的任何提示,将不胜感激:如何将OVERLAPPED结构转换为js-ctypes?

typedef struct _OVERLAPPED { 
    ULONG_PTR Internal; 
    ULONG_PTR InternalHigh; 
    union { 
    struct { 
     DWORD Offset; 
     DWORD OffsetHigh; 
    }; 
    PVOID Pointer; 
    }; 
    HANDLE hEvent; 
} OVERLAPPED, *LPOVERLAPPED; 

这是不对的,但我开始与

const struct_overlapped = new ctypes.StructType("overlapped", 
    [ {"Internal": ctypes.uint64_t.ptr}, 
    {"InternalHigh": ctypes.uint64_t.ptr}, 
    [ [ {"Offset": ctypes.uint32_t}, 
     {"OffsetHigh": ctypes.uint32_t} ], 
     {"Pointer": ctypes.voidptr_t} ], 
    {"hEvent": ctypes.voidptr_t} ]); 

,但我不知道如何处理的“联盟”,第二结构。

更新。也许这样?

const struct_offset = new ctypes.StructType("offsetStruct", 
    [ {"Offset": ctypes.uint32_t}, 
    {"OffsetHigh": ctypes.uint32_t} ]); 

const struct_overlapped = new ctypes.StructType("overlapped", 
    [ {"Internal": ctypes.uint64_t.ptr}, 
    {"InternalHigh": ctypes.uint64_t.ptr}, 
    [ {"offsetStruct": ctypes.struct_offset}, 
     {"Pointer": ctypes.voidptr_t} ], 
    {"hEvent": ctypes.voidptr_t} ]); 

但我得到一个错误

Message: Error: struct field descriptors must contain one property

更新2也许第一次尝试将工作?

回答

0

在获得重叠结构和完成例程之前,这些同步阻塞API(如WinAPI,COM​​,Objective-C,GTK,XCB,X11等)等的解决方案是使用工作。

请注意,GTK和ObjC和X11中的一些回调必须位于主线程中。由于不可修正的错误,不可能使用dispatch_queue来设置工作人员在主线程上的回调。

窗户充满了乐趣,工作人员没有汗水。

我个人喜欢PromiseWorkers - https://developer.mozilla.org/en-US/docs/Web/API/PromiseWorker - 我砍死它,这样我就可以调用从mainthread功能从PromiseWorker(你可能不需要这个,所以我不建议复制从我的插件的PromiseWorker锅炉板)

+1

在https://developer.mozilla.org/en-US/docs/Web/API/ChromeWorker上担心此注意事项 - 此功能不标准,不在标准轨道上。不要在面向Web的生产站点上使用它:它不适用于每个用户。实现之间也可能存在很大的不兼容性,并且行为在未来可能会发生变化。 – tofutim

+1

将使用ChromeWorker允许我的加载项被批准吗? – tofutim

+0

@ tofutim,该警告是为web开发人员。 ChromeWorkers强烈推荐用于插件,因为它将所有内容都放在主线程中。在未来,一切都将来自ChromeWorker,这就是计划。那么他们表示,他们希望所有的主线程,我想这是一个ChromeWorker。 – Noitidart