VC写的DLL发送wm_copydata消息到VB程序,接收中文字符是乱码。VC写的DLL中是这样写的:
CString strDataToSend="test";
COPYDATASTRUCT   cpd;   
cpd.dwData   =   0;   
cpd.cbData   =   strDataToSend.GetLength()+1;   //这里不加1也同样有问题。
cpd.lpData   =   (void*)strDataToSend.GetBuffer(cpd.cbData);   
::SendMessage(g_hWnd,WM_COPYDATA,0, (LPARAM)&cpd);   
strDataToSend.ReleaseBuffer();VB中是这样写的:
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
    
        MsgBox sData & "," & cds_Data.cbDataEnd If
Wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)接收英文字符没有问题,但接收中文字符后,msgbox出来的总是乱码。

解决方案 »

  1.   

    这是英文你的字符处理方式的问题,中文是Unicode编码,英文是ASCII编码
      

  2.   

    长度有问题了
    CString strDataToSend=CString("test你好!");  COPYDATASTRUCT  cpd;   cpd.dwData  =  0;  
    cpd.cbData  = strDataToSend.GetLength() * 2; 
    cpd.lpData  = (void*)strDataToSend.GetBuffer(strDataToSend.GetLength());  
    ::SendMessage(hWndTarget,WM_COPYDATA,0, (LPARAM)&cpd);  
    strDataToSend.ReleaseBuffer();     If uMsg = WM_COPYDATA Then
            Dim cpd As COPYDATASTRUCT
            
            CopyMemory cpd, ByVal lParam, Len(cpd)
        
            Dim sData As String        With cpd
                sData = Space$(.cbData / 2)
                CopyMemory ByVal StrPtr(sData), ByVal cpd.lpData, cpd.cbData
                
                MsgBox sData & "," & Len(sData)
            End With
            
        End If
      

  3.   

    不乱才怪。一般来说,VB+VC的工程里不能把字符串放在结构里在不同语言间传递。因为vb的字符串类型是一个极其复杂且具有相当智能的对象,相比vb的string类型来说,vc的CString则是简单的对指针的封装。你想在VC里构建VB的String是做得到的,但是极其麻烦,绝不是像你的代码中把vc的指针传给它就行了的。建议在VB+VC的工程里传递字符串采用 VC端DLL函数的参数用 char* var,VB端调用参数申明为 byval var as string 的方法。因为VB内核处理申明为 byval 的 string 对象时要经历一个字符串封包和解包的过程,可以省去你大量的工作。如果你不放弃传递包含VB String的结构指针的方法。你就必须在VC中自己编写大量的代码在内存中把 vb 的 String 对象实现出来。没有现成的东西给你用,因为 VB 的 String 类型对应于 VC中ATL COM工程的 BSTR 对象,如果你使用了 ATL COM 模版,你就无法生成普通的DLL。如果你不用ATL COM模版,仅引用其头文件试图使用 BSTR 对象的话你会面临一大堆错误。而且,你上面的那段代码不仅仅是中文乱码的问题,就算你只用英文,你的程序也会在运行较长时间后因内存泄露、越权访问、无效指针等莫名其妙的问题而崩溃。因为你相当于把一个手动挡汽车交到了一个只会开自动挡汽车的驾驶员手上。