2016-04-15 6 views
-1

In meiner VB.NET-Anwendung verwende ich eine Funktion von einer DLL, die mir eine Zeichenfolge geben soll. Beim Aufruf der Funktion gibt mir der Callback die Länge dieser Zeichenfolge und eine Adresse anstelle der Zeichenfolge selbst.String aus der Adresse in VB.NET

Ich habe versucht, die Zeichenfolge mit diesem Code zu bekommen, aber ich denke, es ist für VB klassischen gemeint war, nicht für VB.NET:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Object, ByVal Source As Object, ByVal Length As Long) 
Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long 

Private Function pvToString(ByVal lPtr As Long) As String 
    If lPtr <> 0 Then 
    pvToString = String(lstrlenA(lPtr), 0) 
    Call CopyMemory(ByVal pvToString, ByVal lPtr, Len(pvToString)) 
    End If 
End Function 

I 4 Fehler bekommen, und ich weiß nicht, wie loswerden von ihnen:

  1. '.' erwartet (für die Leitung 5 für String)
  2. 'String' ist eine Typ-Klasse und nicht als Ausdruck verwendet werden kann (Zeile 5)
  3. Expression erwartet (für die Leitung 6 für ByVal)
  4. Expression erwartet (für Zeile 6 für ByVal)

Sorry, wenn meine Frage dumm ist. Ich bin ein Starter in der Programmierung und VB.NET

+0

Was Ich kann dir helfen mit: Entferne die 'ByVal's. –

+0

Volles Beispiel, wie man das benutzt, ist hier: http://www.pinvoke.net/default.aspx/urlmon/CopyMemory.html –

+0

Nach dem Betrachten einer VB6-Dokumentation, die 'String()' Funktion erstellt nur eine Zeichenfolge gefüllt mit der angegebenen Menge eines bestimmten Zeichens. Sie sollten diese Zeile ohne Probleme entfernen können. –

Antwort

-3

Sieht aus wie Ihre Erklärung etwas wie

Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As String 

statt

Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long 

leider keinen Zugang zu Visual Studio haben sollte jetzt zu testen Dies. Aber es sieht so aus, als ob es falsch läuft.

PS: Deklaration könnte auch für die andere Funktion falsch sein. versuchen Sie, ByVal

+0

warum -vote? Dies könnte eine bessere Antwort für Sie sein. http://stackoverflow.com/questions/3921852/how-to-get-the-string-from-an-address-specified-by-a-long-in-vb – Imran

+0

Sie haben wahrscheinlich einen Downvote, weil was du bist Sprichwort ist falsch. Eigentlich sollte es "Integer" sein: http://www.pinvoke.net/default.aspx/kernel32.lstrlen - ** Auch **, der Link, den du ihm gegeben hast, ist fast genau der gleiche Code, den er benutzt, also es wird nicht funktionieren. –

+0

Auch "ByVal" macht die Deklaration nicht falsch. Wenn Sie 'ByVal' nicht verwenden, wird es standardmäßig vom Compiler hinzugefügt. Ich denke, diese beiden Punkte erklären den Downvote. –

1

Erste über Fehler:
1 und 2: verwenden Sie stattdessen neue Zeichenfolge ('', len).
3 und 4: entfernen call und ByVal
und alle Long Variablen und Argument als integer lstrlen erwarten werden erklären müssen, die als IntPtr deklarieren werden sollte.
sowieso sollte man alles vergessen. wenn Sie einen Zeiger (IntPtr) haben und die Sie konvertieren möchten es auf String, der je nach Ihrer String-Typ können Sie ganz einfach nutzen:
dim myString als string = System.Runtime.InteropServices.Marshal.PtrToStrXXXX (MyPSZString)

+0

Ich habe Ihren Marshal-Vorschlag verwendet. Jetzt bekomme ich chinesische Zeichen anstelle von lateinischen Zeichen. Das ist ziemlich komisch, weil die Quellzeichen in lateinischen Buchstaben geschrieben sind. – VBStarter

+0

Ich habe Marshal.PtrToStrAuto() verwendet – VBStarter

+0

Hat 'PtrToStrAuto' das Problem gelöst? Probieren Sie BStr und Uni Versionen. Können Sie die Signatur Ihrer nicht verwalteten Funktion einfügen? –

Verwandte Themen