2017-11-27 24 views
1

この問題を修正しましたが修正できませんでした。 私は読み込み用のdllファイルと古いrfdiカードリーダー(RF20Eが呼び出されている)を持っています 私はそれを読んでカードを操作することができましたが、それはセクターの読書になると失敗します!ここ はC DLLは、私がしようとしている私はvb.net</p> <p>にそれを使用する必要があり、古いVB6のプログラムを持っているVB6で正常に動作しますが、vb.netにエラーが発生します(保護されたメモリを読み書きしようとしました)

Dim databuff32 As String * 32 
address = 4 
sector = 1 
loadmode = 0 

st = rf_authentication(ByVal icdev, loadmode, sector) 
If st <> 0 Then 
     M1_label.Caption = "Call rf_authentication() error.Exit!" 
     Exit Sub 
End If 

st = rf_read_hex(ByVal icdev, address, databuff32) 
If st <> 0 Then 
    M1_label.Caption = "Call rf_read_hex error.Exit!" 
    Exit Sub 
End If 

上記のコードは

ここだけで正常に動作し.hのライブラリ関数

でVB6

Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Long, ByVal Adr%, ByVal sdata As String) As Integer 

をから関数宣言であり、ここでVB6での関数呼び出しであります

__int16 __stdcall rf_read_hex(HANDLE icdev,unsigned char _Adr, char *_Data); 

でも、私がvb.netで同じことをしようとすると、保護されたメモリが得られます。エラー

ここでは私のコード

Public Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Integer, ByVal Adr%, ByRef sdata() As Char) As Short 
    Dim sector As Integer = 1 
    Dim address As Integer = 4 
    Dim loadmode = 0 
    st = rf_authentication(icdev, loadmode, sector)     
    st2 = rf_read_hex(icdev, address, databuff32) 

rf_authenticationが正常に動作しています!

私はdatabuff32バイト文字列のさまざまなタイプを試しましたが、タイプエラーまたはメモリエラーが発生しています。

しかし、タイプをDim databuff32 As Charとして設定し、減速機能で参照をByRef sdata As Charとして設定しても、!!!!!私は最初の値だけを読み取ることはできません

私はかなりの問題は、文字列* 32減速だと確信していますが、私はそれを修正することができませんでした!

助けてくれてありがとう!

答えて

2

すべてのVB.NETパラメータが正しくありません。 icdevIntPtrAdrBytesdataByVal sdata As Char()またはByVal sdata As Stringである必要があります。

また、ではなく、DllImportを使用してください。後者はVB6との下位互換性のためにのみ存在します。

はこれを試してみてください:

<DllImport("rf20e.dll", CharSet:=CharSet.Auto)> _ 
Public Shared Function rf_read_hex(ByVal icdev As IntPtr, ByVal Adr As Byte, ByVal sdata As Char()) As Short 
End Function 

あなたは.NETに特定のWin32タイプをマップする方法の一覧については、私のこの回答を参照してください:https://stackoverflow.com/a/46547553/3740093

+0

助けに感謝が、これは私の答えを波平:

Public Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Integer, ByVal adr As Integer, <MarshalAs(UnmanagedType.LPStr)> ByVal sdata As StringBuilder) As Short 

、ここでは、呼び出しがあります!私は私の問題を解決しましたPublic Declare Function rf_read_hex Lib "rf20e。これは答えで、私はdatabuff32を新しいstrgingbuilder(64)として宣言しました。すべては現在問題ありません。 –

1

いくつかは、より多くの私は私の問題を解決した試した後! !ここ

作品宣言です:

Dim databuff32 As New StringBuilder(64) 
st2 = rf_read_hex(icdev, address, databuff32) 
+0

Glad you 'icdev'と' Adr'は 'IntPtr'と' Byte'(C関数に基づく)でなければなりません。 –