2015-07-30 2 views
1

Iam пытается запустить функции winscard с помощью js-ctypes в Firefox. У меня есть код C, и я начал копировать код в javascipt. Unfortunetly мой первый функции- SCardEstablishContext возвращает следующую ошибку:js-ctypes Недопустимые аргументы

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

Эй, @ Кароль, вы уже загрузили свою работу в github? Я проделал определенную работу, чтобы перечислить всех читателей здесь: http://stackoverflow.com/a/32169381/1828637 Мне было бы приятно увидеть, что вы сделали из этого дополнения. – Noitidart

ответ

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

Я думаю, что проблема с людьми, поскольку они не выполняли 'ContextHandle.address()' с этим и 'ctypes.voidptr_t', это работает, однако его действительно удивительно знать, что' CARDCONTEXT' является 32-битным int, я не мог найти этот typedef, поэтому i просто используйте 'voidptr_t'. Если его 32-битный int, то на 64-битной системе ctypes.int будет 64 бит, поэтому нам пришлось бы заставить его 32-битный с другим типом типов. – Noitidart

+0

'ctypes.uint32_t' будет 32-битным целым, если так, если бы мы были точны, мы бы сделали это:' var SCARDCONTEXT = ctypes.uint32_t; 'и' var LPSCARDCONTEXT = SCARDCONTEXT.ptr; ' – Noitidart

+1

@Noitidart Не совсем, на Windows 'int' и' long' (SCARDCONTEXT typedef'd как 'long' 32-разрядные для обеих платформ (32-разрядная и 64-разрядная Windows).' Voidptr_t' - 32-разрядная версия на 32-битных платформах и 64 -бит на 64-битных платформах.Таким образом, 'voidptr_t' не будет соответствовать определению SCARDCONTEXT. Контракт для' ctypes.int' должен следовать определению платформы 'int'. Следовательно,' ctypes.int' будет 32-битным целым числом, которое соответствует определению 'int' и' long' в Windows. –

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_SERVICE за https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values, и это совершенно не имеет смысла, так как мой компьютер не имеет считыватель карт.

Но этот код работает и показывает вам, как увидеть ошибку, которую вы получаете. :) Продолжайте изумительную работу и продолжайте публиковать здесь, если вам нужна помощь!

Существует также канал jsctypes на серверах moz irc. Можно скопировать этот URL-адрес в ваш firefox: irc://moznet/jsctypes

Смежные вопросы