0

私のプロジェクトでは、チップをデコードする必要があります。デコードは、最初に C ++ コンパイラと DLL ファイルを使用して行われました。幸いなことに、C++ でのデコードの検証は完了しており、機能しています。

インポートされた C dll 関数は次のとおりです。

short int  Byte_read(BOOL Mode,int cm, char* tet, char* stat, char* adr, char* nbr, char* data);

残念ながら、VB6 と同じ DLL ファイルを使用した私のテスト デコードは機能しません。いくつかのテストを行いましたが、まだチップを読み取ることができません。VB6 でデコードできるようにする必要がありますが、障害がどこにあるのか、またはこれを達成する方法についての指示が欠けているのかを理解できませんか?

機能しない VB6 コードは次のとおりです。

Const DATA_ARRAY = 129

Private Sub Command2_Click() 


Dim x As Long
Dim CData(DATA_ARRAY) As Byte 
Dim buffer(3) As Byte 

x= lire(True, 1, "2", buffer, "00", "09", CData)

コードが正しいかどうかを確認してください。助けてくれてありがとう。サービスを提供することは私にとって重要です。

4

2 に答える 2

0

の一部のパラメーターはByte_read、文字列ではなく文字配列です。

文字列パラメーターにアクセスする方法を説明する関連する回答があります。

代わりに試してください:

Private Declare Function Byte_read Lib "RFID_VC_VB1.dll" ( _ 
ByVal Mode As Long, _ 
ByVal nCom As Long, _
ByRef head() As byte, _ 
ByRef status() As byte, _ 
ByRef adresse() As byte, _ 
ByRef number() As byte, _ 
ByRef Data() As byte) As Long

文字列をバイト配列にマップする必要があります。最後のバイトがゼロであることを利用します。

于 2013-08-31T15:22:39.823 に答える
0

あなたdeclareは大丈夫そうです。問題は、実際のパラメーターの宣言にあります。これらのバイト配列はキャストされStrings 渡さByValれるため、返されたものは呼び出しの直後に破棄されます。

出力文字列パラメーターがデータを取得するには、呼び出し元が次のように割り当てる必要があります

Dim CData       As String
Dim buffer      As String
...

CData = String$(DATA_ARRAY + 1, 0)
buffer = String$(3 + 1, 0)
retour_byte_read = Byte_read(True, 1, "2", buffer, "00", "09", CData)
CData = Left$(CData, InStr(CData, Chr$(0)) - 1)
buffer = Left$(buffer, InStr(buffer, Chr$(0)) - 1)

Debug.Print CData, buffer

「最悪」の場合に十分なスペースを割り当てるのは、呼び出し元の責任であることに注意してください。これは、C 関数リファレンスに記載されている必要があります。

ByValまた、VB6 宣言内の文字列は渡されないことに注意してください。ByValこれは、文字列パラメーターをchar*型 (ANSI) としてマークするハックです。VB6 は、関数を呼び出す前に Unicode -> ANSI 変換を実行し、関数呼び出し後に ANSI -> unicode を逆方向に変換するため、出力文字列パラメーターに適切な "VB 文字列" が得られます。

于 2013-09-02T09:03:51.137 に答える