js-ctypes 无效参数
js-ctypes invalid arguments
我正在尝试 运行 在 Firefox 中使用 js-ctypes 的 winscard 功能。
我有工作的 C 代码,我开始将代码复制到 javascipt。
不幸的是我的第一个功能- SCardEstablishContext returns 出现以下错误:
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,它因此无法分配值(因为 reference/pointer 不受实际数据内存支持)。
因此,您应该将 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();
它不会为我工作,因为我没有卡 reader 它一直给我错误 0x8010001d
这是 SCARD_E_NO_SERVICE
每个 https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values 这完全是有道理的我的电脑没有网卡 reader.
但此代码有效,并向您展示了如何查看您收到的错误 :) 如果您需要帮助,请继续努力并继续在这里发帖!
moz irc 服务器上也有 jsctypes 频道。可以将此 url 复制粘贴到您的 firefox 中:irc://moznet/jsctypes
我正在尝试 运行 在 Firefox 中使用 js-ctypes 的 winscard 功能。 我有工作的 C 代码,我开始将代码复制到 javascipt。 不幸的是我的第一个功能- SCardEstablishContext returns 出现以下错误:
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,它因此无法分配值(因为 reference/pointer 不受实际数据内存支持)。
因此,您应该将 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();
它不会为我工作,因为我没有卡 reader 它一直给我错误 0x8010001d
这是 SCARD_E_NO_SERVICE
每个 https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values 这完全是有道理的我的电脑没有网卡 reader.
但此代码有效,并向您展示了如何查看您收到的错误 :) 如果您需要帮助,请继续努力并继续在这里发帖!
moz irc 服务器上也有 jsctypes 频道。可以将此 url 复制粘贴到您的 firefox 中:irc://moznet/jsctypes