2017-11-27 71 views
1

내가 내가하려고 한 C dll은 VB6에서 잘 작동하지만 vb.net에 오류 (보호 된 메모리를 읽거나 쓰려고 시도)

vb.net

에서 사용할 필요가 오래된 VB6 프로그램이 있습니다 이 문제를 해결했지만 해결할 수 없습니다. 나는 dll 파일을 읽고 독서를 위해 rfdi 카드 리더 (RF20E가 호출 됨) 나는 그것을 읽기 카드에서 작동하도록 관리했지만 섹터 읽기에 관해서는 실패했다! 여기 는

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 바이트 char 문자열을 시도했지만 유형 오류 또는 메모리 오류가 발생했습니다!

그러나 유형을 Dim databuff32 As Char으로 설정하고 감속 기능에서 참조 번호를 ByRef sdata As Char으로 설정하면 작동하지만 !!!!! 난 단지 첫 번째 값을 아무것도 읽을 수 없다

나는 문제가 그 문자열 * 32 감속하지만 나는 그것을 고칠 수 없다는 것을 확신한다!

도움 주셔서 감사합니다!

답변

2

모든 VB.NET 매개 변수가 잘못되었습니다. icdevIntPtr이어야하며, Byte이어야하고 sdataByVal sdata As Char() 또는 ByVal sdata As String이어야합니다.

또한 .NET에서는 Declare ... Function이 아닌 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

감사하지만 내 대답을 않네! 내 문제를 해결 공공 선언 함수 rf_read_hex Lib "rf20e.dll "(ByVal icdev As Integer, ByVal adr 정수, ByVal sdata As StringBuilder) 이것은 짧은 답변으로서 저는 새로운 strgingbuilder (64)로 databuff32를 선언했습니다. 이제는 괜찮습니다. –

1

을 좀 더 내가 해결 한 시도 내 문제 후! !

여기에 작동하는 선언입니다 :

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 

를 여기에 호출입니다 : 도움을

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

'icdev'와'Adr'은 확실히'IntPtr'와'Byte' (C 함수에 기반) 여야합니다. –