SCardSCardEstablishContext -> SCARD_E_INVALID_PARAMETER

Gradrag

Grünschnabel
Hallo,
zu erst bin relativ neu in der Materie,
und wäre froh wenn mir jemand ein zwei Fragen beantworten könnte.

Ich soll daten von einer Chipkarte Lesen...
und da fängt gleich das erste problem an ...
das einbinden der c-bibliotek hat soweit ja noch geklappt (

CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "Winscard" : "c+"),CLibrary.class);


)
aber der auf ruf der ersten methode daraus , Liefert nicht das gewünschte Ergebniss:

die Methode um die es sich handelt ist
SCardSCardEstablishContext{

DWORD dwScope,
LPCVOID pvReserved1,
LPCVOID pvReserved2,
LPSCARDCONTEXT phContext }

diese methode verlangt ja das man ihr 4 parameter übergibt.

soweit auch gut bis auf den fakt das das ja keine java daten typen sind ...
also dacht ich mir ersetze diese "unbekanten" datentypen mit java datentypen ( ich denk mal das ich die Falschen genommen habe da ich jetz den fehler code :
80100004 also SCARD_E_INVALID_PARAMETER bekomme)
meine frage ist also welche daten typen ich am besten verwenden soll zur übergabe


Ich würd mich freund wenn mir jemand helfen könnte
vielen dank für die Bemühungen einen Anfänger zu helfen .
mfg Gradrag
 
Hi und Willkommen bei tutorials.de :)

DWORD ist ein 32bit-unsigned-int. Sowas gibts in Java nicht.
Allein vom Bitaufbau her sollte es ein "normales" signed-32bit-int auch tun.

LPCVOID ist ein Pointer auf irgendwas nicht genau Bekanntes.
Auch das gibts in Java nicht.
Entsprechen tun auch dem ints, allerdings je nach Plattform 4 oder 8 Byte groß.

LPSCARDCONTEXT ist ein Pointer auf eine Struktur. Das wird problematisch.

Wäre es für dich eine Option, einen C-Wrapper zu schreiben?
 
Schonmal vielen dank das sich einer gemeldet hat :D
c-Wrapper ich denk mal ist ne option also wens nötig ist wohl ja muss aber erstmal schaun was das ist und wies geht :D meld mich dann wenn ich dazu die information (ggf. weitere fragen habe :D)

Nachmals vielen vielen dank und werd es gleich mal mit den Int werten versuchen
 
Wie gesagt, mit der Struktur im letzten Parameter wirst du mit int nicht weiterkommen.

Mit C-Wrapper meine ich, dass du mit C statt Java einen kleinen Code schreibst,
der die Funktion aufruft (da sie auch in C geschrieben ist),
aber selbst für Java passende Parameter nimmt.

Wenn du mir den Strukturaufbau einmal zeigst könnte ich dir besser helfen.
 
mh gut nen c-compiler dürft ich glaub schon haben zwar noch nich wirklich was in c geschrieben aber das heist wohl hinsetzen lernen :)


Meinst das mit stucktur oder von welcher strucktur redest du ?



PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testlauf;

/**
 *
 * @author mija
 */
import java.util.*;
import java.nio.Buffer;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Platform;
import com.sun.jna.WString;
import com.sun.jna.win32.StdCallLibrary;



import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class Testlauf {
 
    
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
                Native.loadLibrary((Platform.isWindows() ? "Winscard" : "c+"),CLibrary.class);
         
 // eingebundene Lib
          
          
          
          
  public  Long  SCardEstablishContext(
  int dwScope,
  int pvReserved1,
 int pvReserved2,
  int phContext
);
  


  





    }
public Long uebergabe(int a,int b,int c,int d){

Long e=CLibrary. INSTANCE.SCardEstablishContext(a,b,c,d);



    

return e;
}

    /**
     * @param args the command line arguments
     */
   public static void main(String[] args) {
      

    NewJFrame a=new NewJFrame();
    a.setVisible(true);
      
    
  
    }
    
    
}
 
Mit Struktur (struct) meine ich SCARDCONTEXT (auf der C-Seite, nicht in Java).
Du solltest eine/mehrere .h-Dateien haben, da drin sollte SCARDCONTEXT zu finden sein.

Und bitte Forenregeln beachten. Erster Link in meiner Signatur, §15.
 
So das ist das Einzige was ich bis jetz zu SCARDCONTEXT gefunden habe in winscard.h

PHP:
typedef ULONG SCARDCONTEXT;
typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;

typedef ULONG SCARDHANDLE;
typedef SCARDHANDLE *PSCARDHANDLE, *LPSCARDHANDLE;

#define SCARD_AUTOALLOCATE (DWORD)(-1)

#define SCARD_SCOPE_USER     0  // The context is a user context, and any
                                // database operations are performed within the
                                // domain of the user.
#define SCARD_SCOPE_TERMINAL 1  // The context is that of the current terminal,
                                // and any database operations are performed
                                // within the domain of that terminal.  (The
                                // calling application must have appropriate
                                // access permissions for any database actions.)
#define SCARD_SCOPE_SYSTEM    2 // The context is the system context, and any
                                // database operations are performed within the
                                // domain of the system.  (The calling
                                // application must have appropriate access
                                // permissions for any database actions.)


Hoffe das ist die Strucktur die du brauchst.
 
:eek: Auch ein Int-Typ?
Sorry...dachte, es ist eine struct.
Jedenfalls ja, das ist die richtige Codestelle.

...Wenn das so ist, kannst du für diesen vierten Parameter
genauso verfahren wie mit dem ersten (DWORD).
Der C-Wrapper ist damit überflüssig geworden.
 
Ich bedank mich recht herzlich bei dir , Danke.
Aus diesen H-Datein dürfte ich doch dann auch sicherlich herrausbekommen wieso der Rückgabewert immer SCARD_E_INVALID_PARAMETER und welche konkreten Werte ich der Methode übergeben muss?

pvReserved1 und int pvReserved2 dürften ja 0 sein da:

pvReserved1
[in] Void pointer reserved for future use; must be NULL. Reserved to enable a suitably privileged management application to act on behalf of another user.
pvReserved2
[in] Void pointer reserved for future use; must be NULL. Reserved to enable a suitably privileged management application to act on behalf of another terminal.
(http://msdn.microsoft.com/en-us/library/ms938536.aspx)
 
Ja, wenn das da steht, übergibst du von Java aus 0.
Das "reserved" hat darauf sowieso schon hingewiesen.

Bleiben noch der erste und der letzte Parameter als Fehlerquelle.
 
Zurück