Hallo,
Blackbox schrieb:
Zitat: |  | Int aus C ist in VB immer ein LONG
Rückgabewerte als Parameter ist immer ByRef nicht ByVal
|  |
Hatte ich bereits erwähnt.
Zitat: |  |
Dim strar(256) As Byte
Dim sRet As String
Dim adr As Long
adr = lut_name ( ... )
If adr > 0 Then
CopyMemory ByVal VarPtr(strar(0)), ByVal adr, 256
'Byte-Code in Unicode umwandeln
sRet = StrConv(strar(), vbUnicode)
End IF |  |
Wenn man den String manuell marshallt, müsste man aber doch zunächst die Länge des Strings durch die Position des \0-Zeichens (mit dem C-Strings terminiert werden) ermitteln und für VB dieses dann nicht mitkopieren, oder? Z.B. so:
Option Explicit
Public Declare Function kto_check_retval Lib "konto_check.dll" Alias _
"kto_check_retval2txt@4" ( _
ByVal retval As Long _
) As Long
Public Declare Function lut_name Lib "konto_check.dll" Alias "lut_name@12" ( _
ByVal blz As String, _
ByVal zweigstelle As Long, _
ByRef ret As Long _
) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByVal Destination As Long, _
ByVal Source As Long, _
ByVal Length As Long)
Public Function MarshalCString(ByVal adr As Long) As String
Dim sRet As String
If adr > 0 Then
'Länge des Strings ermitteln.
Dim tempChar As Byte, strlen As Long
Do While True
CopyMemory VarPtr(tempChar), adr + strlen, 1
If tempChar = 0 Then Exit Do
strlen = strlen + 1
Loop
If strlen > 0 Then ' strlen: Stringlänge ohne \0
Dim strar() As Byte
ReDim strar(strlen - 1)
CopyMemory VarPtr(strar(0)), adr, strlen
'Byte-Code in Unicode umwandeln
sRet = StrConv(strar, vbUnicode)
Else 'Empty String
sRet = ""
End If
Else
' Eigentlich Null-String, aber für VB auch leeren String verwenden.
sRet = ""
End If
MarshalCString = sRet
End Function und dann z.B.
Dim sRet As String
Dim adr As Long
adr = lut_name( ... )
sRet = MarshalCString(adr) wobei es etwas langsam sein könnte, für jedes Byte CopyMemory aufzurufen.
Beitrag wurde zuletzt am 11.01.13 um 16:16:10 editiert. |