2012-09-27 64 views
1

我在VB6中使用此代碼發送數據使用`字符串傳遞到另一個窗口WM_COPYDATA`

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) 

你能幫助我的代碼vurrently接受它,我有這個

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)) 

如果我發送Hello,我得到它H e l l o

回答

1

你正在混合字符串轉換。

您發送的代碼會發送一個指向完整unicode字符串的指針。 當你收到它時,你將它傳遞給StrConv(..., vbUnicode),它從ANSI轉換爲unicode,「破壞」字符串數據。

要解決這個問題,你只需要最後的字節數組直接分配給字符串:

sData = B 

或者,您可以分配字符串的長度和直接複製到其中:

Dim sData As String 
sData = String(tCDS.cbData/2, vbNullChar) ' characters are 2-bytes each 
CopyMemory ByVal StrPtr(sData), ByVal tCDS.lpData, tCDS.cbData 
+0

我可以問你爲什麼這樣做'tCDS.cbData/2',我認爲Unicode字符串會按觀測原始空間爲2個字節每個字符 – Smith

+0

我得到一個類型在此行'SDATA =字符串匹配(vbNullChar,tCDS.cbData/2)'所以我這樣開這個'sData = String(tCDS.cbData/2,vbNullChar)' – Smith

+0

爲了發送它,你需要乘以兩倍。 'WM_COPYDATA'處理字節,而字符串長度是以字符爲單位的。每個字符是兩個字節。我也修復了對'String()'的調用。 – Deanna

0

該字符串是Unicode格式的

在uncode中,每個單個字符佔用2個字節,因爲ASCII只是1個字節,所以我認爲vb用空格填充另一個字節(ma YBE)

相關問題