js-ctypes无效的参数

时间:2015-07-30 14:06:45

标签: javascript windows smartcard jsctypes

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

2 个答案:

答案 0 :(得分:1)

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());

答案 1 :(得分:1)

您的问题是,您需要通过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_SERVICEhttps://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