OCXのイベントにて文字列のポインタを扱い方法は?

解決


OSMM  2005-05-07 00:17:03  No: 121483

こんにちは、いつも参考にさせていただいています。
よろしくお願いします。

OCX(VC)からイベントで文字列のポインタをlongにて受信した場合、
String型への格納方法を教えてください。

※BSTR(VC)->String(VB)にて受け渡しするのが普通ですが
  あえてlongにこだわっています。


ガッ  2005-05-07 01:28:02  No: 121484

※VB6と仮定
charの配列としての、終端NULLな文字列の先頭のポインタなら、
WinAPIのlstrlenで長さを得て、RtlMoveMemoryでByte配列にコピーしてみたり。
…昔どこかで見かけた記憶が…?

※文字コードもそろえないとなぁ…


OSMM  2005-05-07 02:04:26  No: 121485

レスありがとうございます。

すいません。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$)したくない点


ガッ  2005-05-07 02:45:28  No: 121486

ノ■ミ
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

※保障ナシ


OSMM  2005-05-07 03:32:36  No: 121487

ガッさま
完璧!!です。
ありがとうございます。
すっきりしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加