Wysyłam dane przy użyciu tego kodu w vb6

cds.dwData = CLng(RegisterWindowMessage("MyWMCopyData"))
cds.cbData = Len(Message) * 2 ' characters are 2-bytes each
cds.lpData = StrPtr(Message) ' access the string's character buffer directly
' Send the string.
Dim i As Long:i = SendMessage(lHwnd, WM_COPYDATA, MainForm.hwnd, cds)

Czy możesz mi pomóc z kodem, aby go otrzymać vurrently mam to?

Dim B() As Byte
ReDim B(0 To tCDS.cbData - 1) As Byte
CopyMemory B(0), ByVal tCDS.lpData, tCDS.cbData
Dim sData As String
sData = Trim$(StrConv(B, vbUnicode))

Jeśli wyślę Hello, otrzymam go jako H e l l o

1
Smith 27 wrzesień 2012, 11:56

2 odpowiedzi

Najlepsza odpowiedź

Mieszasz konwersje ciągów.

Twój kod wysyłający wysyła wskaźnik do pełnego ciągu Unicode. Kiedy go otrzymasz, przekazujesz go do StrConv(..., vbUnicode), który konwertuje z ANSI na Unicode, „uszkadzając” dane ciągu.

Aby rozwiązać ten problem, wystarczy przypisać ostateczną tablicę bajtów bezpośrednio do ciągu:

sData = B

Alternatywnie możesz przydzielić długość ciągu i skopiować bezpośrednio do niego:

Dim sData As String  
sData = String(tCDS.cbData / 2, vbNullChar) ' characters are 2-bytes each
CopyMemory ByVal StrPtr(sData), ByVal tCDS.lpData, tCDS.cbData
1
Deanna 27 wrzesień 2012, 16:01

Ciąg jest w formacie Unicode

W uncode każdy pojedynczy znak zajmuje 2 bajty, ponieważ ASCII miał tylko 1 bajt, więc myślę, że vb wypełnia kolejny bajt spacją (być może)

0
GaryNg 9 październik 2012, 12:40