Js-ctypes无效参数

js-ctypes invalid arguments

本文关键字:参数 无效 Js-ctypes      更新时间:2023-09-26

我试图在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