咋就不成功呢,发送了个DATACOPY消息(74#),不仅仅是lpdata.data没过来啊,消息根本就没过来。。咋个事?

解决方案 »

  1.   

    handle是正确的……
    首先给对方申请一段内存,然后在首地址写上代码68 &hXXXXXXXX
    68 0
    68 7A
    68 HANDLE
    E8 SENDMESSAGE ADDRESS
    C3
    CC
    00
    ……
    其中&hXXXXXXXX是LPDATA数据的内存地址,LPDATA实际数据存放在申请的内存的后半部分。我咋觉得我写的没问题啊,查看申请的内存的内容反汇编确实也是上面的内容啊反顺序提供参数,非INTEGER类型使用指针,E8后面的相对地址计算……在测试其他API函数时,均没有问题,包括GETWINDOWTEXTA(W)等等啊
    是不是这个……和消息循环有关啊
      

  2.   

    对了,偶用VISTA,U是俩心的,有啥关系吗?WRITEPROCESSMEMORY自动刷新缓存的,不用FLASH……啥的啥的,应该不是这个问题吧因为其他的API用起来都么问题呀,等高手指教……贴一个图,调用GETWINDOWTEXTW的调用
    这段的代码是这样的:(.NET的代码)    Public Structure COPYDATASTRUCT
            Public WindowHwnd As Integer
            Public size As Integer
            <MarshalAs(UnmanagedType.LPStr)> _
            Public lpData As String
            Shared Function ToByres(ByVal c As COPYDATASTRUCT) As Byte()
                Dim ret(c.size + 7) As Byte
                Array.Copy(System.BitConverter.GetBytes(c.WindowHwnd), 0, ret, 0, 4)
                Array.Copy(System.BitConverter.GetBytes(c.size), 0, ret, 4, 4)
                Dim sb() As Byte = System.Text.Encoding.ASCII.GetBytes(c.lpData)
                Array.Copy(sb, 0, ret, 8, sb.Length)
                Return ret
            End Function
        End Structure
        Const WM_COPYDATA As Integer = &H4A    Dim send As RunRemoteAPI    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        send = New RunRemoteAPI(CInt(TextBox1.Text))
            ' Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long        Dim s(1023) As Byte        Dim a As Integer = send.CallRemoteAPIByName("user32", "getwindowtextw", True, New mFuncParam(Me.Handle.ToInt32), New mFuncParam(s), New mFuncParam(1024))        MsgBox(System.Text.Encoding.Unicode.GetString(send.RemoteBytesFromIndex(1)))
            Dim c As New COPYDATASTRUCT
            c.WindowHwnd = Me.Handle.ToInt32
            c.lpData = "1234567890"
            c.size = c.lpData.Length        Dim cb As Byte() = COPYDATASTRUCT.ToByres(c)
            'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long        TextBox3.Text = Hex(send.CallRemoteAPIByName("User32", "SendMessageA", True, New mFuncParam(Me.Handle.ToInt32), New mFuncParam(WM_COPYDATA), New mFuncParam(0), New mFuncParam(cb)))
            TextBox2.Text = Hex(send.BaseAddress)        Debug.Print("ok")    End Sub接收消息的是这样的:   Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
            Select Case m.Msg
                Case WM_COPYDATA
                    Dim mystr As New COPYDATASTRUCT()
                    Dim mytype As Type = mystr.[GetType]()
                    mystr = DirectCast(m.GetLParam(mytype), COPYDATASTRUCT)
                    MsgBox(mystr.lpData)
                Case Else
                    MyBase.DefWndProc(m)
            End Select
        End Sub根本就没反应…………消息没过来
      

  3.   

    发送WM_COPYDATA消息不要在目标进程内分配内存,直接用本进程中的内存,系统会自动实现进程间的数据传递。
      

  4.   

    WM_COPYDATA是自动的吧,我是远线程让其他进程调用SENDMESSAGE,所以参数都在对方进程内存里是正确的啊。当我的进程收到WM_COPYDATA时,自动根据最后一个参数用READPROCESSMEMORY复制对方进程内存内容到我的进程吧
      

  5.   

    WM_COPYDATA是自动的吧,我是远线程让其他进程调用SENDMESSAGE,所以参数都在对方进程内存里是正确的啊。当我的进程收到WM_COPYDATA时,自动根据最后一个参数用READPROCESSMEMORY复制对方进程内存内容到我的进程吧
      

  6.   

    服了,一顿修改之后,发现,
    1、使用&H40A等自定义消息,且不等待远线程退出,我的程序就能接受到消息……
    2、使用&H40A等自定义消息,且等待远线程退出,那么我的程序就卡死在等待那里。
    3、使用&h4A(WM_COPYDATA),等待远线程退出和不等待远线程退出,都不会接收到消息,而且等待函数立即返回……
      

  7.   

    估计是因为用了SendMessage的问题,我找到篇文章说应该用PostMessage,文章里面说的虽然是钩子不是远程线程,但也是DLL向主程序发送数据,我想应该对楼主有点参考价值:http://hi.baidu.com/zhuzhenping/blog/item/3bf832fa7c981f9559ee90d8.html
      

  8.   

    发WM_COPYDATA消息不需要考虑跨进程的问题,当作是本进程内来处理。
      

  9.   

    我在写一个dll的时候,把时钟栏的消息全部截了发给远程进程,就用sendmessage,没有任何问题,而且很实在的实现了远程同步,虽然没有测试 WM_copydata,但我觉得不应该有问题吧?包括自定义消息都传递的很流畅
      

  10.   

    。问题找到了,可还是没解决好,是WM_COPYDATA的结构COPYDATASTRUCT的定义问题,封装的时候也不知道.NET干TMD啥子了算了,改用DLL注入。就写了这么几行汇编就快疯掉了,要全汇编,直接死了
      

  11.   

    我有个现成的代码,也是asm写的,要吗,需要的话给你
    就是给dll注入然后给远程进程的控件子类话,把消息发到本地过程处理的代码
      

  12.   

    谢谢楼上好意。昨天决定还是写DLL来完成这些任务了,无奈,只好拿VC++.NET2008来搞了10几个小时,终于搞定了,不熟练的语言用起来还就是别扭,不过还没有用汇编别扭就是了。
    不过用DLL搞的时候也发生了同样问题,在请教达人之后发现VC++.NET的代码没问题,最后还是定位在lpData参数声明上,在GOOGLE上千搜万索找到一个鸟语网站,受到点化……问题解决。
    就是说LPSTR不是正道。。
    感谢各位支持,散分。