こんにちは、いつも参考にさせていただいています。
よろしくお願いします。
OCX(VC)からイベントで文字列のポインタをlongにて受信した場合、
String型への格納方法を教えてください。
※BSTR(VC)->String(VB)にて受け渡しするのが普通ですが
あえてlongにこだわっています。
※VB6と仮定
charの配列としての、終端NULLな文字列の先頭のポインタなら、
WinAPIのlstrlenで長さを得て、RtlMoveMemoryでByte配列にコピーしてみたり。
…昔どこかで見かけた記憶が…?
※文字コードもそろえないとなぁ…
レスありがとうございます。
すいません。VB6SP6です。
朝から苦戦中です。
現在は、WinAPIのMoveMemoryでString型にコピーしていますが
もっとすっきりしたいです。
Private Sub Sample_OnConnect(info As Long, info_len As Long)
Dim w_buf As String
Dim w_buf2 As String
'## 領域確保 ##
w_buf = String$(info_len, Chr$(0))
'## ポインタコピー ##
MoveMemory StrPtr(w_buf), info, info_len
'## 整形 ##
buf2 = Left$(StrConv(w_buf, vbUnicode), info_len)
End Sub
すっきりしたい点
(1)領域確保という言い訳でNULLを詰めいている点
(2)MoveMemory後、バッファ(w_buf)の内容が"????"となっている点
(3)整形(Left$)したくない点
ノ■ミ
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Function GetString(ByVal char_Array_Pointer As Long) As String
Dim Length As Long
Dim buf() As Byte
Length = lstrlen(char_Array_Pointer)
If Length > 0 Then
ReDim buf(1 To Length)
CopyMemory buf(1), ByVal char_Array_Pointer, Length
GetString = StrConv(buf, vbUnicode)
Else
GetString = ""
End If
End Function
※保障ナシ
ガッさま
完璧!!です。
ありがとうございます。
すっきりしました。
ツイート | ![]() |