js-ctypes无效的参数

Iam试图在Firefox中使用js-ctypes来运行winscard函数。 我有工作的C代码,我开始复制代码到javascipt。 不幸的是我的第一个函数SCardEstablishContext返回以下错误:

SCARD_E_INVALID_PARAMETER 0x80100004

什么错误的论点?

Components.utils.import("resource://gre/modules/ctypes.jsm"); const NULL = ctypes.voidptr_t(0); var cardLib = ctypes.open("C:\\WINDOWS\\system32\\WinSCard.dll"); var SCardEstablishContext = cardLib.declare("SCardEstablishContext", ctypes.winapi_abi, ctypes.uint32_t, ctypes.uint32_t, ctypes.voidptr_t, ctypes.voidptr_t, ctypes.voidptr_t); var ContextHandle = new ctypes.voidptr_t(); var ret = SCardEstablishContext(2, NULL, NULL, ContextHandle); cardLib.close(); 

SCardEstablishContext( phContext )的最后一个参数应该是一个指向32位整数的指针。 一旦成功,SCardEstablishContext将使用SCARD上下文的句柄来填充此整数值。

您将ContextHandle定义为ctypes.voidptr_t新未初始化实例,该实例与ctypes.voidptr_t(0)基本相同(因此为空指针)。 然后,您将这个空指针传递给SCardEstablishContext,通常情况下,它不能分配一个值(因为参考/指针不是由实际数据存储器支持的)。

因此,应该将ContextHandle定义为voidptr_t(32位平台上的32位整数/ 64位平台上的64位整数)

 var ContextHandle = ctypes.voidptr_t(0); 

然后将指针传递给这个ContextHandle到SCardEstablishContext函数:

 var ret = SCardEstablishContext(2, NULL, NULL, ContextHandle.address()); 

你的问题是你需要传递ContextHandle.address()你只传递ContextHandle

这是我的代码风格:

 Cu.import('resource://gre/modules/ctypes.jsm'); //const NULL = ctypes.voidptr_t(0); // no need for this, just use js null var is64bit = ctypes.voidptr_t.size == 4 ? false : true; var TYPES = { ABI: is64bit ? ctypes.default_abi : ctypes.winapi_abi, CALLBACK_ABI: is64bit ? ctypes.default_abi : ctypes.stdcall_cabi, DWORD: ctypes.unsigned_long, LPCVOID: ctypes.voidptr_t, LPSCARDCONTEXT: ctypes.voidptr_t } var CONST = { SCARD_SCOPE_USER: 0, SCARD_SCOPE_SYSTEM: 2, SCARD_S_SUCCESS: 0 }; var cardLib = ctypes.open('Winscard'); var SCardEstablishContext = cardLib.declare("SCardEstablishContext", TYPES.ABI, TYPES.DWORD, TYPES.DWORD, TYPES.LPCVOID, TYPES.LPCVOID, TYPES.LPSCARDCONTEXT); var ContextHandle = TYPES.LPSCARDCONTEXT(); var ret = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM, null, null, ContextHandle.address()); console.info('ret:', ret, ret.toString()); if (ret.toString() != CONST.SCARD_S_SUCCESS.toString()) { console.error('failed to establish context! error code was: ' + ret + ' in other terms it is: 0x' + ret.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values'); } cardLib.close(); 

它不会为我工作,我没有一个读卡器,它不断给我错误0x8010001d这是SCARD_E_NO_SERVICE每个https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85% 29.aspx#smart_card_return_values这完全有道理,因为我的电脑没有读卡器。

但是,这段代码的作品,并告诉你如何看到你所得到的错误:)保持了真棒的工作,并继续张贴在这里,如果你需要帮助!

在moz irc服务器上也有jsctypes通道。 可以复制粘贴到您的Firefox的这个网址: irc://moznet/jsctypes