Daten auf Chip-Karte schreiben (mit Towitoko-Chipdrive)



  • Hallo Ihr!

    Hat jemand ein Chipdrive von Towitoko und weiss, wie man einen String
    auf die Karte schreibt?
    Auslesen einer Karte hab ich hinbekommen, aber das schreiben....

    Zum Test hab ich einen Button in meinem SDI angelegt, bei dem per
    MessageBox der Inhalt der Karte ausgespuckt wird.
    Der Code dazu sieht so aus:

    void CStempeluhrView::OnButton1()
    {   
        char buf[2048];
    
        CString command;
        command = "Card,MemRead";
        m_CardServer.SCardCommand(command, NULL, 0, buf, sizeof(buf));
        AfxMessageBox(buf);
    }
    

    Die mitgelieferte SCardCommand-Funktion sieht so aus:

    DWORD CCardServer::SCardCommand(LPCSTR Cmd, LPCSTR DataIn, INT DataInLen, LPSTR DataOut, INT DataOutLen)
    {
        DWORD dwResult = MAXDWORD;
        DWORD hSvrInst = 0;
    
        memset(DataOut, 0, DataOutLen);
    
        if (m_pSCardCommand != NULL)
           dwResult = (m_pSCardCommand)(&hSvrInst, Cmd, 0, DataIn, &DataInLen, DataOut, &DataOutLen);
        return dwResult;
    }
    

    Das Kommando zum Schreiben auf die Karte müsste laut Doku "Card,MemWrite" sein.
    Wäre spitze wenn mir jemand was konstruktives dazu sagen könnte.

    Merci!!!!!!!!!



  • Ich hab zwar null ahnung, aber einen versuch ist es ja wert.

    also es heisst ja,

    DWORD CCardServer::SCardCommand(LPCSTR Cmd, LPCSTR DataIn, INT DataInLen, LPSTR DataOut, INT DataOutLen)

    dann versuch doch mal was in der Richtung wie,

    CString str = "Speicher mich drauf, bitte!";
    int lenght = str.Lenght();
    CString command = "Card,MemWrite";
    
    m_CardServer.SCardCommand(command, str, lenght, NULL, 0);
    

    Kannst mir ja sagen obs gefunzt hat. 😉

    cu



  • Hi,

    merci für deine antwort.
    Ich hab ein paar variationen deines Vorschlags ausprobiert.
    Das ganze war leider nicht von Erfolg gekrönt.

    Für die Stringlänge rauszubekommen hab ich dann die str.GetLenght() verwendet.
    die spuckt scheinbar die Länge binär aus -> laut meiner MessageBox
    aber schau mal wie ich es versucht hab:

    void CStempeluhrView::OnBwrite() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    	CString str = "Speicher mich drauf, bitte!";
    	int lenght = str.GetLength();
    	char buffer[10];
    	AfxMessageBox(_itoa(lenght,buffer,2));
    	CString command = "Card,MemWrite";
    
    	m_CardServer.SCardCommand(command, str, lenght, NULL, 0);
    }
    


  • hmmm, das ist komisch. ups ja stimmt ist GetLenght() natürlich.

    und wenn du nimmst als Test mal

    LPCSTR str "Speicher mich drauf, bitte!";
    
    m_CardServer.SCardCommand(command, str, 10, NULL, 0);
    

    So speichert er nicht alles ab aber müsste gehen. wenn es geht dann die real lenght ermitteln.

    Und was geht nicht? Bringt er Fehlermeldung, oder?? Was mich auch wundert, ist das man nicht angibt wo man schreibt. sprich ab welchem byte. weil so müsste es immer an der bzte Position 0 beginnen mit der entsprechenden länge. Und die max lenght ist dann z.b. 256 oder so.

    Hast du entsprechende doku? maybe online am besten, wo du die posten kannst?

    was du auch versuchen kannst ist am schluss nicht NULL,0 zu schreiben sonder mit buf wieder. kann sein das du reinschreibst und dies als bestätigung dass es funzt auch gleich wieder rauslesen tust. probieren kannst es ja.



  • hab mal in internet kurz nachgeschaut

    hier die komplett doku

    http://212.227.59.54/ftp/docu/scrd214d.pdf

    also musst halt schauen, aber wenn ich kurz mal überfliegt muss es dann heissen

    CString command = "Card,MemWrite,16,21";  // schreibt ab adresse 16, 21 zeichen
    

    les dir in ruhe mal die ganze doku durch. 😉 🙂



  • find ich echt rührend, wie du dich meines problems annimmst 🙄

    ich lade gerade das ganze toolkit hoch
    müsste gleich unter:
    http://www.klose2you.de/Toolbox.rar
    bereitstehen.
    Er bringt keinerlei Fehlermeldungen, er macht einfach nix. sprich er schreibt nix



  • nur zur info für den/die fleissigen helfer:
    Ich habs hinbekommen. war eigentlich ganz einfach:

    void CStempeluhrView::OnBwrite() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    	char buf[1024];
    
    	CString marcos_command2, teste;
    	char test[]="tachle";
    	marcos_command2 = "Card,MemWrite,0,7";
    
    	m_CardServer.SCardCommand(marcos_command2,test,sizeof(test),NULL,0);
    
    //// Nur zum Testen, ob geschrieben wurde ///////////////////////////////////	
    	marcos_command2 = "Card,MemRead";	
    	m_CardServer.SCardCommand(marcos_command2, NULL, 0, buf, sizeof(buf));
    	teste = buf;
    	m_testausgabe.SetWindowText(teste);
    /////////////////////////////////////////////////////////////////////////////
    
    }
    


  • hehe dacht ichs mir. so wie ich es sagte muss man das start byte ( start adr. ) und dann angeben wie lang die message sein soll. weil sonst würde man ja echt nur eine nachricht immer am anfang speichern können 😉 😉

    freut mich das es gut ging



  • 😃
    Danke nochmal. ich bin echt immer wieder erstaunt wie schnell man hier ne antwort bekommt. Weiter so jungs (und Mädels, falls vorhanden)!!!!!!!!!!


Log in to reply