2014-08-31 2 views
-1

나는 그것을 내가 VB.NET P/호출 동등한로 변환 할 다음과 같은 네이티브 C 함수 선언을 호출하기 위하여 : 당신이 할 수마샬링 배열 반환 값으로 P/Inoke .NET은

unsigned char *h5d65bv(const unsigned char *a, const int alen) 

이 함수는 바이트의 배열을 반환하고 매개 변수로 바이트의 다른 배열 인 a와 길이 (alen)를 취합니다. 그래서

<DllImport("mydll.dll", EntryPoint:="h5d65bv", BestFitMapping:=False, CallingConvention:=CallingConvention.Cdecl, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Ansi)> _ 
    Friend Function h5d65bv(ByVal a As Byte(), <MarshalAs(UnmanagedType.I4)> ByVal alen As Int32) As Byte() 
    End Function 

, 하나는 다음과 같습니다

나는 ('.'리턴 값 '에서/관리되지 않는 서명이 일치 관리 ") .NET 오류에 따라 올바른되지 않습니다 서명을 사용 올바른 "서명"(배열 및 포인터와 관련이 있어야하지만 배열에 관한 인터넷에서 아무것도 찾지 못했습니다 반환 유형)?

+0

'h5d65bv'와 같은 이름은 앞으로 많은 문제가 발생한다는 매우 강력한 힌트입니다. –

답변

1

실제로 반환 유형은 부호없는 char에 대한 포인터 일뿐입니다. 할당 된 문자 수는 함수의 구현에 따라 다르며 .NET은이를 알 수 없습니다.

.NET에서 반환 형식을 IntPtr으로 설정 한 다음 Marshall.Copy을 사용하여 수동으로 배열을 복사하는 것입니다. 하지만 그 가정 배열의 길이를 알고있다.

Dim ptr As IntPtr = h5d65bv(input, input.Length) 
Dim output As New Byte(100) 
Marshall.Copy(ptr, output, 0, 100) 

또 다른 점

는 할당 된 메모리를 해제해야 할 수도 있다는 것입니다,하지만 다시 h5d65bv 기능을 할당하는 방법에 따라 달라집니다.

+0

이 함수는 간단한 malloc 문을 사용하여 배열을 할당합니다. 반환 된 배열의 길이는 항상 20입니다 (즉, 20 바이트가 저장되고 더 이상 아무것도 저장되지 않습니다) – Jason