我试图在火狐中使用js cTypes运行winscard函数。
我有正在工作的c代码,我开始将代码复制到javascipt。
不幸的是,我的第一个函数scardestablishcontext返回以下错误:
scard_e_无效的_参数0x8010004
这些论点有什么错?

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(32位平台上的32位整数/64位平台上的64位整数)

var ContextHandle = ctypes.voidptr_t(0);

然后将指向此ContextHandle的指针传递给scardestablishcontext函数:
var ret = SCardEstablishContext(2, NULL, NULL, ContextHandle.address());

10-08 04:58