Einzelnen Beitrag anzeigen

Dr.MAD

Registriert seit: 16. Jan 2006
18 Beiträge
 
#3

AW: Massives Problem mit MCardInitialize = ???

  Alt 16. Mär 2011, 15:51
Oh Mann - wieder mal meine (p)Ansi-Schwäche


Jetzt gehts:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var X: Integer;
    slReaders: TStringList;
    ret: Cardinal;
    Hex: String;
    hSCard: SCARDCONTEXT;
    ReaderNameStr: String;
    ReaderNameAnsiAry: Array of AnsiChar;
    hMCard: MCARDCONTEXT;
    MCardDllVer: DWORD;
begin
  Memo1.Clear;
  slReaders:=TStringList.Create;

  // Alle SmartCard-Lesegeräte erfassen
  GetSmartCardReadersList(slReaders);
  Memo1.Lines.Add('Erfasste SmartCard-Lesegeräte:');
  Memo1.Lines.Add(slReaders.Text);

  if slReaders.Count>0 then begin

    // Ressourcenmanager einbinden
    ret:=SCardEstablishContext(0, nil, nil, @hSCard); // SCARD_SCOPE_USER | SCARD_SCOPE_SYSTEM
    Memo1.Lines.Add('Ressourcenmanager einbinden - ret: '+IntToStr(ret));
    ConvertDecToHex(hSCard,Hex,8);
    Memo1.Lines.Add('Ressourcenmanager einbinden - hSCard: '+IntToStr(hSCard)+' = '+Hex);
    Memo1.Lines.Add('');

    if ret=0 then begin

      // MCard starten
      ReaderNameStr:=slReaders.Strings[0]+#0;
      SetLength(ReaderNameAnsiAry, Length(ReaderNameStr));
      for X:=1 to Length(ReaderNameStr) do ReaderNameAnsiAry[X-1]:=AnsiChar(ReaderNameStr[X]);
      ret:=MCardInitialize(hSCard, @ReaderNameAnsiAry[0], @hMCard, @MCardDllVer); // PReader
      // Speicher freigeben
      SetLength(ReaderNameAnsiAry, 0);
      ConvertDecToHex(ret, Hex, 8);
      Memo1.Lines.Add('MCard starten - ret: '+IntToStr(ret)+' = '+Hex+' = '+GetSorMCardReturnCode(ret));
      Memo1.Lines.Add('MCard starten - hMCard: '+IntToStr(hMCard));
      Memo1.Lines.Add('MCard starten - MCardDllVer: '+IntToStr(MCardDllVer));
      Memo1.Lines.Add('');

      if ret=0 then begin


        // ...


        // MCard beenden
        ret:=MCardShutdown(hMCard);
        ConvertDecToHex(ret, Hex, 8);
        Memo1.Lines.Add('MCard beenden - ret: '+IntToStr(ret)+' = '+Hex+' = '+GetSorMCardReturnCode(ret));
        Memo1.Lines.Add('');

      end;

      // Ressourcenmanager lösen
      ret:=SCardReleaseContext(hSCard);
      Memo1.Lines.Add('Ressourcenmanager lösen - ret: '+IntToStr(ret));
      Memo1.Lines.Add('');

    end;
  end;
  slReaders.Free;
end;
Matthias
  Mit Zitat antworten Zitat