使用js-ctypes进行的Win32打印失败,出现ERROR_INVALID_HANDLE

时间:2013-08-22 03:08:43

标签: javascript winapi ctypes print-spooler-api

我正在将二进制组件转换为js-ctypes,而StartPagePrinter正在给我ERROR_INVALID_HANDLE。我正在使用标准Windows技术进行打印。 (搜索“MSDN WritePrinter”以查看基本步骤。)我想我要么使用错误的类型,要么不进行某种演员。

我没有使用ctypes.uintptr_t作为jobHandle,而是尝试了ctypes.intptr_t,ctypes.voidptr_t和ctypes.int32_t。他们都失败了同样的错误。

我必须承认这是我30年职业生涯中第一次进行的Win32编程,所以请耐心等待。

以下是代码段:

Components.utils.import('resource://gre/modules/ctypes.jsm');
var winspoolLib = ctypes.open('winspool.drv');
var spoolssLib = ctypes.open('spoolss');
const docNameLength = 32;
const printer = "My Printer"; // A valid, configured printer
var jobHandle = new ctypes.uintptr_t(0);
var openPrinter = winspoolLib.declare(
    "OpenPrinterW", ctypes.winapi_abi, ctypes.bool, ctypes.jschar.ptr,
    ctypes.uintptr_t.ptr, ctypes.voidptr_t
);
if (openPrinter(printer, jobHandle.address(), null)) {
    const docInfo1 = new ctypes.StructType(
        "docInfo1",
        [
            {pDocName: ctypes.jschar.ptr},
            {pOutputFile: ctypes.voidptr_t},
            {pDataType: ctypes.voidptr_t}
        ]
    );
    var startDocPrinter = winspoolLib.declare(
        "StartDocPrinterW", ctypes.winapi_abi, ctypes.int32_t,
        ctypes.uintptr_t, ctypes.int32_t, docInfo1.ptr
    );
    var docInfo = new docInfo1(
        ctypes.jschar.array(docNameLength)('MYJOB'), null, null
    );
    var job = startDocPrinter(jobHandle, 1, docInfo.address());
    if (job != 0) {
        var startPagePrinter = spoolssLib.declare(
            "StartPagePrinter", ctypes.winapi_abi, ctypes.bool,
            ctypes.uintptr_t
        );
        if (! startPagePrinter(jobHandle))
            // Always fails with ERROR_INVALID_HANDLE (6)
            alert('There was an error: ' + ctypes.winLastError);
    }
} 

1 个答案:

答案 0 :(得分:1)

我搞定了!忽略MSDN文档,不要使用spoolss.dll。使用winspool.dll中的所有函数。这就是答案。

不需要使用RAW设置。 Null工作正常。

最后,voidptr_t是正确的类型。