2016-04-15 14 views
-1

私のVB.NETアプリケーションでは、文字列を与える.dllの関数を使用します。 関数を呼び出すときに、コールバックはその文字列の長さと文字列自体の代わりにアドレスを返します。VB.NETのアドレスからの文字列

私はこのコードで文字列を取得しようとしましたが、私はそれはVBの古典のためではなく、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 

は私が4つのエラーを取得し、私は取り除く方法がわかりません

  1. '。'予想(ByValのための6行目の場合)期待(文字列の回線5用)
  2. 「string」はクラス型であり、(5行目の場合)式として使用することができない
  3. 期待式(用行6 for ByVal)

申し訳ありませんが、私の質問は愚かです。私はあなたの宣言は

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

の代わりに、申し訳ありません

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

テストするために、今のVisual Studioにはアクセスできませんのようなものでなければなりませんように

+0

何私はあなたを助けることができます: 'ByVal'を削除します。 –

+0

これを使用する方法の完全な例は、ここにあります:http://www.pinvoke.net/default.aspx/urlmon/CopyMemory.html –

+0

VB6のドキュメントを見て、 'String()'関数は、特定の文字の指定された量で。この行は問題なく削除できます。 –

答えて

-3

が見えるプログラミングにおけるスターターとVB.NETよこの。しかし、これが間違っているところです。

PS:他の機能についても宣言が間違っている可能性があります。 ByVal

+0

なぜ-vote?これはあなたにとってより良い答えかもしれません。 http://stackoverflow.com/questions/3921852/how-to-get-the-string-from-an-address-specified-by-a-long-in-vb – Imran

+0

あなたはおそらくあなたがdownvoteを持っているからです言っているが間違っている。実際にはIntegerでなければなりません:http://www.pinvoke.net/default.aspx/kernel32.lstrlen - **また、**あなたが彼に渡したリンクは、彼が使っているコードとほとんど同じです。動作しません。 –

+0

また、ByValは宣言を間違ったものにしません。 ByValを使用しないと、デフォルトでコンパイラによって追加されます。私はこれらの2つの点がダウンボントを説明していると思います。 –

1

最初にエラーについて:
1と2:代わりに新しい文字列( ''、len)を使用してください。
3と4:callByVal
を削除し、すべてのLong変数と引数は整数としてのIntPtrとして宣言されなければならないlstrlenを期待して宣言する必要があります。いずれにしても、すべてを忘れてしまいます。
あなたはポインタ(のIntPtr)を持っているし、あなたの文字列型に依存し、それを文字列に変換したい場合は、簡単に使用することができます。
薄暗いのmyStringを文字列として= System.Runtime.InteropServices.Marshal.PtrToStrXXXX(MyPSZString)

+0

私はあなたのマーシャル提案を使用しました。今、私はローマ字の代わりに中国語の文字を取得します。ソース文字列がローマ字であるため、これは非常に奇妙です。 – VBStarter

+0

Marshal.PtrToStrAuto()を使用しました – VBStarter

+0

'PtrToStrAuto'で解決しましたか? BStrとUniバージョンを試してみてください。アンマネージ関数の署名を挿入できますか? –