首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

同一进程通过消息发送、接收数据,该如何解决

2012-02-07 
同一进程通过消息发送、接收数据发送端:VC2008 + XP//字符集:使用多字节字符集 , 使用Unicode字符集无法编

同一进程通过消息发送、接收数据
发送端: VC2008 + XP //字符集:使用多字节字符集 , 使用Unicode字符集无法编译,此程序使用MFC的共享动态库规则
  extern "C" BOOL PASCAL EXPORT cookie()
{
CString strTmp = "";
if (handle_cookie > 0)
{
CString strData = "in data ";
for (int i = 0 ;i < 10 ;i ++)
{

strTmp.Format("%s =%d",strData,i);  
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = strData.GetLength()+ 1;
cds.lpData = (void *)strData.GetBuffer(cds.cbData);
SendMessage(handle_cookie, WM_COPYDATA, NULL, (LPARAM)&cds);
}

}
return FALSE ;
}
  
接收端: VB + XP 
Private pData As COPYDATASTRUCT
Public pRecData As Long
Public sData As String

Public Function RegMsg()
  preWinProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
  ret = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf GetURLDataProc)
End Function
Option Explicit

Public Type COPYDATASTRUCT
  dwData As Long
  cbData As Long
  lpData As Long
End Type

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)


Public preWinProc As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_COPYDATA = &H4A
Public Const WM_MY_COPYDATA = &H401
Public ret As Long

Public Function GetURLDataProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If Msg = WM_COPYDATA Then
  Dim cds_Data As COPYDATASTRUCT
  Dim sData$
  CopyMemory ByVal VarPtr(cds_Data), ByVal lParam, ByVal Len(cds_Data)
   
  sData = Space$(cds_Data.cbData)
  CopyMemory ByVal StrPtr(sData), ByVal cds_Data.lpData, ByVal cds_Data.cbData
  OutputDebugString "tp===" & sData
  End If
  GetURLDataProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function

现在出现的问题是发什么,接收什么都是乱码?
 

[解决办法]
既然送过来的不是 Unicode,你需要自己进行转换。

VB code
OutputDebugString "tp===" & StrConv(sData, vbUnicode)
[解决办法]
恭喜了。学习。学习
[解决办法]
恭喜恭喜,蹭分
[解决办法]
用Spy++跟踪

热点排行