0

声明 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 字符串(如果可用)。但是我无法修复它,我感谢任何高级帮助。

4

1 回答 1

1

在 winapi 中,如果函数有两个版本,unicode 版本和 ascii 版本,如果它需要字符串。所以文档显示这接受字符,所以在它显示的页面上:SCardStatusW (Unicode) and SCardStatusA (ANSI)所以你必须像这样定义它:var SCardStatus = cardLib.declare(ifdef_UNICODE ? 'SCardStatusW' : 'SCardStatusA', ....

于 2015-09-08T20:47:32.007 回答