在库中找不到功能符号

时间:2015-08-30 08:02:47

标签: winapi firefox-addon smartcard jsctypes winscard

声明SCardStatus函数会导致错误:“找不到库中的函数符号”

守则如下:

Cu.import('resource://gre/modules/ctypes.jsm');
var is64bit = ctypes.voidptr_t.size == 4 ? false : true;
var ifdef_UNICODE = true;
var TYPES = {
    ABI: is64bit ? ctypes.default_abi : ctypes.winapi_abi,
    CHAR: ctypes.char,
    DWORD: ctypes.uint32_t,
    LONG: ctypes.long,
    LPCVOID: ctypes.voidptr_t,
    ULONG_PTR: is64bit ? ctypes.uint64_t : ctypes.unsigned_long,
    WCHAR: ctypes.jschar,
};
TYPES.LPSTR = TYPES.CHAR.ptr;
TYPES.LPDWORD = TYPES.DWORD.ptr;
TYPES.LPWSTR = TYPES.WCHAR.ptr;
TYPES.SCARDHANDLE = TYPES.ULONG_PTR;
TYPES.LPBYTE = TYPES.LPSTR;
TYPES.LPTSTR = ifdef_UNICODE ? TYPES.LPWSTR : TYPES.LPSTR;
var cardLib = ctypes.open('Winscard');
var SCardStatus = cardLib.declare('SCardStatus', TYPES.ABI, TYPES.LONG, TYPES.SCARDHANDLE, TYPES.LPTSTR, TYPES.LPDWORD, TYPES.LPDWORD, TYPES.LPDWORD, TYPES.LPBYTE, TYPES.LPDWORD );

我猜TYPES.LPBYTE不正确,根据https://msdn.microsoft.com/en-us/library/windows/desktop/aa379803%28v=vs.85%29.aspx,LPBYTE应该是指向32字节缓冲区的指针,该缓冲区从当前插入的卡中接收ATR字符串(如果可用)。但是,我无法解决它,我感谢任何先进的帮助。

1 个答案:

答案 0 :(得分:1)

在winapi中,如果函数有两个版本,unicode版本和ascii verison IF它需要字符串。所以文档显示这会接受字符,所以在页面上显示:$1-$2 所以你必须这样定义:SCardStatusW (Unicode) and SCardStatusA (ANSI)