我试图在火狐中使用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());