PCSC-Programmierung - SCardEstablishContext()



  • Hallo,

    ich möchte meine Memory Karte initialiseren. Dazu brauche ich die Funktion aus winscard.h

    PCSC_API LONG SCardEstablishContext(
       DWORD dwScope,
       /*@null@*/ LPCVOID pvReserved1,
       /*@null@*/ LPCVOID pvReserved2,
       /*@out@*/ LPSCARDCONTEXT phContext);
    

    aus der MCard-API muss folgende Funktion zum Init. benutzt werden:

    /* ScardContext is the context obtained through SCardEstablishContext */
    char szReader[] = “CCID SCM Microsystems Reader”;
    MCARDCONTEXT hMCardContext;
    DWORD dwDLLVersion;
    
    LONG lReturn = MCardInitialize (
                          ScardContext,
                          szReader,
                          &hMCardContext,
                          &dwDLLVersion
                                   )
    

    Bei meiner Programm sieht das folgendermaßen aus:

    #include <iostream>
    #include <string>
    #include "MCardAPI.h"
    using namespace std;
    
    int main( )
    {
    	MCARDCONTEXT	hMCardContext;
    	DWORD		dwDLLVersion;
    	char		szReader[] = "CCID SCM Microsystems Reader";
    	long		tmp_return;
    
    	SCARDCONTEXT scc;
    	long ret = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &scc);
    
    	tmp_return = MCardInitialize(ret, szReader, &hMCardContext, &dwDLLVersion);	
    	//tmp_return = MCardInitialize(&scc, szReader, &hMCardContext, &dwDLLVersion);
    
    	cout << "tmp_return: " << tmp_return << endl;	
    
    	return 0;
    }
    

    Bei Kompilieren erhalte ich:

    g++ -o readOutMcard readOutMcard.cpp
    
    readOutMcard.cpp: In function »int main()«:
    readOutMcard.cpp:105: Fehler: »SCARDCONTEXT***« kann nicht nach »SCARDCONTEXT*« für Argument »4« nach »LONG SCardEstablishContext(DWORD, const void*, const void*, SCARDCONTEXT*)« umgewandelt werden
    user@zx:~/mcard$ g++ -o readOutMcard readOutMcard.cpp 
    /tmp/ccPDplzn.o: In function `main':
    readOutMcard.cpp:(.text+0xcc): undefined reference to `SCardEstablishContext'
    collect2: ld gab 1 als Ende-Status zurück
    

    Über Hilfe würde ich mich freuen.



  • Würde ein Moderator diesen Thread bitte nach WinAPI verschieben?



  • Wenn das Win für Windows steht, dann nicht.
    Bin unter Linux unterwegs.



  • SCardEstablishContext gibts aber nur unter Windows



  • cpp.user.xy schrieb:

    Wenn das Win für Windows steht, dann nicht.
    Bin unter Linux unterwegs.

    Selbst dann bist du im falschen Unterforum (=> Linux).



  • rofl eyes schrieb:

    SCardEstablishContext gibts aber nur unter Windows

    sicher?
    Welche header usw. muss ich für Linux einbinden?
    winscard.h dann wohl nicht.



  • cpp.user.xy schrieb:

    winscard.h dann wohl nicht.

    Für Linux sicher nicht 😉



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Fehlermeldung besagt, dass der Linker die Funktionsimplementierung nicht finden kann. Dies liegt daran, dass du dem Linker nicht sagst, welche Library er linken soll.

    http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

    Mit [c]-llibraryname[/c] kannst du eine Bibliothek, die liblibraryname.so /[c]liblibraryname.a[/c] heißt linken (ggf. mit -L<pfadname> den Pfad angeben). Wenn du so eine Bibliothek hast, dann sollte das ganze auch unter Linux laufen. Falls nicht, dann kann es sein, dass es sich wirklich nur um eine Windowslibrary handelt. Entsprechend solltest du schauen, ob der Hersteller auch eine Linux Bibliothek anbietet (=> Im Notfall mal nachfragen).



  • Danke.
    Nun erhalte ich mit
    g++ -o readOutMcard readOutMcard.cpp -l/usr/lib/libmcscm

    /tmp/ccAwQvAM.o: In function `main':
    readOutMcard.cpp:(.text+0xcc): undefined reference to `SCardEstablishContext'
    readOutMcard.cpp:(.text+0xef): undefined reference to `MCardInitialize(long, char*, long*, unsigned long*)'
    collect2: ld gab 1 als Ende-Status zurück
    

    hmm. Vielleicht ist winscard.h wirklich windows-only 😕



  • Du liest einfach nur nicht genau, was ich geschrieben habe

    rüdiger schrieb:

    Mit [c]-llibraryname[/c] kannst du eine Bibliothek, die liblibraryname.so /[c]liblibraryname.a[/c] heißt linken

    also nur libraryname und nicht das lib oder den pfad oder das .so!

    -lmcscm

    wäre also richtig!



  • Danke, hab aber immernoch die gleichen Kompilierfehler 😞

    Die Header-Dateien sind nicht Windows-only. Sie sind im Paket
    libpcsclite1 bzw. libpcsclite-dev enthalten.

    #include <iostream>
    #include <string>
    #include "MCardAPI.h"
    using namespace std;
    
    int main( )
    {
       /*
        * MCard Init.
        */
       SCARDCONTEXT   ContextHandle;
       char      szReader[] = "SCR333 USB Smart Card Reader";
       MCARDCONTEXT   hMCardContext;
       DWORD      dwDLLVersion;
    
       LONG      rv;
       LONG      IReturn;
    
       rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &ContextHandle);
    
       IReturn = MCardInitialize(ContextHandle, szReader, &hMCardContext, &dwDLLVersion);
       cout << "Init. IReturn: " << IReturn << endl;   
    
       /*
        * MCard Connect
        */
       DWORD   dwConnectMode;
       BYTE   byCardType;
       MCARDHANDLE hMCard;
    
       IReturn = MCardConnect(hMCardContext, dwConnectMode, byCardType, &hMCard );
       cout << "Connect IReturn: " << IReturn << endl;
    
            /*
             * read MCard
             */
       BYTE abyData [20];
       DWORD dwLen = 20;
    
       IReturn = MCardReadMemory(hMCard, 0, 0x80, abyData, &dwLen  );
       cout << "read IReturn: " << IReturn << endl;
    
       return 0;
    }
    

    habe auch folgendes gemacht:
    1. cd /usr/include
    2. ln -s PCSC/ifdhandler.h ifdhandler.h
    3. ln -s PCSC/pcsclite.h pcsclite.h
    4. ln -s PCSC/reader.h reader.h
    5. ln -s PCSC/winscard.h winscard.h
    6. ln -s PCSC/wintypes.h wintypes.h



  • readOutMcard.cpp:(.text+0xcc): undefined reference to `SCardEstablishContext'
    ist nun behoben, durch
    g++ -o readOutMcard readOutMcard.cpp -lpcsclite

    fehlt noch
    readOutMcard.cpp:(.text+0xef): undefined reference to `MCardInitialize(long, char*, long*, unsigned long*)'
    -lmcscm bzw. -L/usr/lib/libmcscm.so.3.06 geht leider nicht.


Anmelden zum Antworten