Hilfe für Zugriff auf unmanaged dll gesucht!

15/01/2009 - 19:22 von Hauer W | Report spam
Hallo!

Ich versuche verzweifelt per Programm auf aien USB Magnetkartenleser
zuzugreifen. Grundsàtzlich gehtes, weil ich kann LEDS auf und abdrehen. ABer
der Zugriff auf die Kartendaten funkt nicht. Und die Beschreibung ist
gegen null.

Ich habe einenen Headerfile in der die Funktion so beschrieben ist:

__declspec(dllimport) int __stdcall TcrGetCardData(int iTcrNo, PTCR_CARD
pTcr);


/////////////////////////////////////////////////////////
//
// Card data buffer structure
//
/////////////////////////////////////////////////////////
#define CARD_DATA_MAX 290 // Maximum byte count of card data
#define JIS2_MAX 69 // Maximum byte count of JIS2 track
#define ISO1_MAX 76 // Maximum byte count of ISO1 track
#define ISO2_MAX 37 // Maximum byte count of ISO2 track
#define ISO3_MAX 104 // Maximum byte count of ISO3 track
typedef struct _TCR_CARD {
UCHAR JIS2Status; // Status of JIS2 track
UCHAR JIS2Data[JIS2_MAX]; // Buffer address of JIS2 track data
UCHAR ISO1Status; // Status of ISO1 track
UCHAR ISO1Data[ISO1_MAX]; // Buffer address of ISO1 track data
UCHAR ISO2Status; // Status of ISO2 track
UCHAR ISO2Data[ISO2_MAX]; // Buffer address of ISO2 track data
UCHAR ISO3Status; // Status of ISO3 track
UCHAR ISO3Data[ISO3_MAX]; // Buffer address of ISO3 track data
} TCR_CARD, *PTCR_CARD;

Sowie ich das verstanden habe, ist ein Pointer auf eine STructur zu
übergeben.

In VB schaut das bei mir so aus:

Public Declare Function TcrGetCardData Lib "TcrDrv.dll" (ByVal hTcr As
Integer, ByRef ptcr As TCR_CARD) As Integer

<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Structure TCR_CARD
Dim JIS2Status As Byte '// Status of JIS2 track
<VBFixedArray(68)> Dim JIS2Data() As Byte '// Buffer of JIS2 track
data
Dim ISO1Status As Byte '// Status of ISO1 track
<VBFixedArray(75)> Dim ISO1Data() As Byte '// Buffer of ISO1 track
data
Dim ISO2Status As Byte '// Status of ISO2 track
<VBFixedArray(36)> Dim ISO2Data() As Byte '// Buffer of ISO2 track
data
Dim ISO3Status As Byte '// Status of ISO3 track
<VBFixedArray(103)> Dim ISO3Data() As Byte '// Buffer of ISO3 track
data

Public Sub Initialize()
ReDim JIS2Data(68)
ReDim ISO1Data(75)
ReDim ISO2Data(36)
ReDim ISO3Data(103)
End Sub
End Structure

Dim GA_hTCr as Integer
Dim GA_Tcr as TCR_Card
Der Zugriff erfolgt mit
ans_L = TcrGetCardData(GA_hTcr, GA_Tcr)

Der Returnparameter ist 1(soll heissen Daten wurden geles), aber in der
Struct steht nix (nur hex 00 en)

Kann mir da wer weiterhelfen?

Liebe Grüße

Wolfgang
 

Lesen sie die antworten

#1 Hauer W
16/01/2009 - 16:20 | Warnen spam
Hallo Armin!

Du hast mir super geholfen Genauso hats geklappt.

Danke und liebe Grüße

Wolfgang


Falls das jemand hilft, so schaut die Structure jetzt aus (ob das alles so
Notwendig ist - keine Ahnung; aber so gehts)


<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Structure TCR_CARD
Dim JIS2Status As Byte '// Status of JIS2 track
<MarshalAs(UnmanagedType.ByValArray, Sizeconst:i)> Dim JIS2Data() As
Byte '// Buffer of JIS2 track data
Dim ISO1Status As Byte '// Status of ISO1 track
<MarshalAs(UnmanagedType.ByValArray, Sizeconst:v)> Dim ISO1Data() As
Byte '// Buffer of ISO1 track data
Dim ISO2Status As Byte '// Status of ISO2 track
<MarshalAs(UnmanagedType.ByValArray, Sizeconst:7)> Dim ISO2Data() As
Byte '// Buffer of ISO2 track data
Dim ISO3Status As Byte '// Status of ISO3 track
<MarshalAs(UnmanagedType.ByValArray, Sizeconst:4)> Dim ISO3Data()
As Byte '// Buffer of ISO3 track data
Public Sub Initialize()
ReDim JIS2Data(68)
ReDim ISO1Data(75)
ReDim ISO2Data(36)
ReDim ISO3Data(103)
End Sub
End Structure
"Armin Zingler" schrieb im Newsbeitrag
news:
Hauer W wrote:
<VBFixedArray(68)> Dim JIS2Data() As Byte '// Buffer of JIS2
track data



VBFixedArray interessiert den Marshaller nicht. Du must das
MarshalAs-Attribut anwenden. Aber frag mich jetzt nicht, welches. (IIRC
ByValArray mit Sizeconst)


Den Rest hab ich jetzt nicht gecheckt.


Armin

Ähnliche fragen