Winscard Dll с WCF

Структура моего проекта

 myApp 
  -->WCFSerLibrary 
  -->ClassLib1
  -->ClassLib2  // This one uses winscard.dll 

Я хотел связаться с подключенным смарт-картой.

Четыре шага, которым я следую для этого,

  1. SCardEstablishContext
  2. Получить имя читателя через SCardListReaders
  3. СКардКоннект
  4. Чтение с помощью SCardTransmit

Первые три шага выполняются успешно, но когда я пытаюсь выполнить SCardTransmit, он возвращает мне код ответа 87.

Вторая сторона. Вышеупомянутый сценарий - это когда я вызываю его из службы WCF. Теперь я использую тот же ClassLib2 в приложении Windows FORm, с которым оно правильно взаимодействует.

 retCode =  ModWinsCard.SCardTransmit(hCard, ref pioSendRequest, ref SendBuff[0], sendLen, ref pioSendRequest, ref RecvBuff[0], ref recvLen);

где как в классе ModWinsCard

   [DllImport("winscard.dll"l)]
    public static extern Int64 SCardTransmit(UInt64 hCard, ref SCARD_IO_REQUEST pioSendRequest, ref byte SendBuff, int SendBuffLen, ref SCARD_IO_REQUEST pioRecvRequest, ref byte RecvBuff, ref int RecvBuffLen);

person Suave Nti    schedule 31.10.2012    source источник
comment
Это похоже на проблему с потоками (и в списке нет ошибки с кодом 87). Не могли бы вы предоставить полный код, работающий с диспетчером ресурсов смарт-карт? Кроме того, что такое myApp? Служба Windows, приложение IIS?   -  person Dennis    schedule 31.10.2012
comment
Dennis myApp — это служба Windows.   -  person Suave Nti    schedule 31.10.2012


Ответы (1)


87 недопустимый параметр. Метод возвращает int не длинное. Также вы передаете только первый элемент в буферах ввода и вывода. Следует использовать IntPtr для дескриптора карты.

LONG WINAPI SCardTransmit(
  _In_         SCARDHANDLE hCard,
  _In_         LPCSCARD_IO_REQUEST pioSendPci,
  _In_         LPCBYTE pbSendBuffer,
  _In_         DWORD cbSendLength,
  _Inout_opt_  LPSCARD_IO_REQUEST pioRecvPci,
  _Out_        LPBYTE pbRecvBuffer,
  _Inout_      LPDWORD pcbRecvLength
);

Может быть, вместо этого попробовать подпись pinvoke ниже?

[DllImport("winscard.dll"l)]
        public static extern int SCardTransmit(
            IntPtr hCard, 
            ref SCARD_IO_REQUEST pioSendRequest, 
            byte[] SendBuff, 
            int SendBuffLen, 
            ref SCARD_IO_REQUEST pioRecvRequest, 
            IntPtr RecvBuff,    // Copy with marshal.copy to a managed array after call.
            ref int RecvBuffLen);
person AbdElRaheim    schedule 31.10.2012
comment
Я ссылаюсь на эту ссылку для того же chenguo.googlecode.com /svn-history/r262/trunk/DriverTest/ где long и int . Я изменил его для поддержки 64-битной ОС. - person Suave Nti; 31.10.2012
comment
Я не уверен, как будет работать передача массивов. ref байт маршаллер просто скопирует один байт и скопирует его. - person AbdElRaheim; 31.10.2012
comment
Ну, вы правы, проблема была в том, что обработчики изменили Int64 hCard на UIntPtr hCard, это сработало :) .. Еще раз спасибо :) - person Suave Nti; 31.10.2012
comment
Нет, это 64-битная версия. Извините, мне нужно что-то изменить? - person Suave Nti; 31.10.2012