vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL ab 
Autor: Preisser
Datum: 11.01.13 15:47

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.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL ab2.573StefanWalda11.01.13 11:14
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.665Preisser11.01.13 13:27
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.666Blackbox11.01.13 15:10
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.635Preisser11.01.13 15:47
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.764Blackbox11.01.13 16:58
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.613Preisser11.01.13 18:08
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.620StefanWalda13.01.13 18:28
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.608Preisser13.01.13 19:02
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.659Blackbox14.01.13 19:46
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.595Preisser14.01.13 20:07
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.733Preisser14.01.13 22:13
Re: VB-IDE stürzt beim Aufruf von Funktionen aus einer C-DLL...1.551StefanWalda30.01.13 21:04

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel