Js-ctypes无效参数
js-ctypes invalid arguments
我试图在Firefox中使用js-ctypes运行winscard函数。我有工作的C代码,我开始复制代码到javascript。不幸的是,我的第一个函数- scardestabishcontext返回以下错误:
0 SCARD_E_INVALID_PARAMETER x80100004
参数有什么问题?
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();
scardestabishcontext (phContext
)的最后一个参数应该是指向32位整数的指针。一旦成功,scardestabishcontext用SCARD上下文的句柄填充这个整数值。
您将ContextHandle
定义为ctypes.voidptr_t
的新的未初始化实例,它本质上与ctypes.voidptr_t(0)
相同(因此是空指针)。然后将这个空指针传递给scardestabishcontext,因此,它不能赋值(因为引用/指针不受实际数据内存的支持)。
ContextHandle
定义为voidptr_t(32位平台上的32位整数/64位平台上的64位整数)
var ContextHandle = ctypes.voidptr_t(0);
,然后将指向ContextHandle
的指针传递给scardestabishcontext函数:
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通道。可以复制粘贴这个url到你的firefox:irc://moznet/jsctypes
- $.Ajax投掷“;无效的参数"在IE9上
- 在 IE8 中接收无效参数
- fancydropdown js:IE8 中的参数无效
- 使用空媒体查询调用matchMedia失败,IE中的参数无效
- 单元测试输入参数无效的promise
- AngularJS IE11参数无效
- 数据表1.8.0添加服务器参数无效
- IE8 中的参数无效
- PHP foreach 提供的参数无效
- 管道“异步管道”的参数无效
- 使用 response.js 的参数无效,适用于 IE8
- SCRIPT87:IE 9、ASP.NET C#中的参数无效
- 数组缓冲区IE10-类型化的数组构造函数参数无效
- foreach参数无效
- 从url中删除参数无效
- 命令行参数无效,验证您正在使用的交换机
- chrome.runtime.sendMessage未捕获错误:要连接的参数无效
- IE中存在AJAX请求错误,参数无效
- 严重性:警告消息:为 foreach() 提供的参数无效 文件名:帮助程序/form_helper.php
- grant_type参数无效或缺少参数