首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • vb如何提取:c写的dll用SendMessage(m_hWnd,12,*str,0);发来的字符串? [已结贴,结贴人:a294447011294447011]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 00:18:54 楼主
    c的dll里的部分代码是:
    ///////////////////////////
    char str[100]="dll发来的消息是: ...";
    SendMessage(m_hWnd,12,*str,0);//m_hWnd是vb窗口的代号
    //////////////////////////////////

    vb的窗口处理函数是:
    '''''''''''''''''''''''''''''
    Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      dim str1 as string*100
      If uMsg = 12 Then
          MsgBox "收到dll字符串消息,字符串是:(?????)"
      End If
      WndProc = CallWindowProc(GetProp(hWnd, OLDWNDPROC), hWnd, uMsg, wParam, lParam)
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''
    vb如何将vc里的str字符串提取到vb代码的"字符串是:(?????)"或str1里????
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 00:45:081楼 得分:0
    c的dll里的部分代应该是:
    ///////////////////////////
    char str[100]="dll发来的消息是: ...";
    SendMessage(m_hWnd,12,strlen(str),*str);//m_hWnd是vb窗口的代号
    //////////////////////////////////
    第一次发错了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Sandrer
    • 等级:
    发表于:2008-05-08 06:16:322楼 得分:5
    用CopyMemory函数(声明你自己找吧,我这里没装VB,查不了)

    VB.NET code
    Dim byteVal() As Byte Dim str As String Redim byteVal(1 To wParam) As Byte '看你从DLL发出的消息,wParam参数应该是字串字节大小 CopyMemory byteVal(1), ByVal lParam, wParam str = StrConv(byteVal, vbFormUnicode) 'str = StrConv(byteVal, vbUnicode) '上面两个字符转换随便试一个,我这里没得调试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 09:44:193楼 得分:0
    12的消息时wm_quit,,,,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 09:59:274楼 得分:5
    2楼的有点错误,对方没有传递字符串长度过来,所以应该是这样
    VBScript code
    Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long dim a(100-1) as byte, lLen as long, str as string If uMsg = 12 Then copymemory a(0), byval wParam, 100 lLen = instrB(1, a, chr(0)) 'C 标准字符串以 \0 结束 if lLen <> 0 then '如果发送的字符串没有用 \0 结束(因此没有用lstrcpy而是用copymemory),就认为字符串长 100,否则截短 redim preserve a(lLen-1) end if str = strconv(a, vbUnicode) MsgBox "收到dll字符串消息,字符串是:(" & str & ")" End If WndProc = CallWindowProc(GetProp(hWnd, OLDWNDPROC), hWnd, uMsg, wParam, lParam) End Function
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    发表于:2008-05-08 10:00:585楼 得分:0
    你dll和VB程序是在一个进程里么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    发表于:2008-05-08 10:01:396楼 得分:0
    你dll和VB程序是在一个进程里么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 11:52:057楼 得分:0
    看不到回复!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 21:29:598楼 得分:0
    回:supergreenbean
    是在一个进程里的!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    发表于:2008-05-08 21:41:319楼 得分:5
    那么VC里面改成
    SendMessage(m_hWnd,12,(WPARAM)str,0);

    VB里面的代码可以用Tiger_Zhao在4楼写的代码


    不过,建议你直接回调VB的过程,从而直接传入字符串
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 20:59:4910楼 得分:0
    c代码我也该成"SendMessage(m_hWnd,12,(WPARAM)str,0); "

    回:VB老鸟
    连接错误啊!
    "ReDim Preserve a(lLen - 1)"错误!提示是:数组维数已经定义!
    我把"dim a(100-1) as byte"改成"dim a() as byte",!错误!提示是:"实时错误:'9'下标越界!"
    怎么办啊?这是什么错误?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    发表于:2008-05-09 22:08:2811楼 得分:0
        dim a() as byte
        redim a(lLen-1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 22:57:0112楼 得分:0
    还是错误!提示是:"实时错误:'9'下标越界!"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 23:16:2713楼 得分:5
    dim a() as byte
    lLen=100
    redim a(lLen-1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 23:17:3714楼 得分:0
    你最好把字符串长度也传过去,方便些,如你在一楼中的方式!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 23:29:2115楼 得分:0
    如何传啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 23:47:1616楼 得分:0
    我改了:
    vc:
    ///////////////////
    SendMessage(m_hWnd,12,(WPARAM)str,(LPARAM)strlen(str));
    //////////////////////
    vb:
    ''''''''''''''''''''''''''''''''''''''''''''''''
    Dim a() As Byte, i As Long, str As String
        If uMsg = 12 Then
            ReDim a(lParam - 1)
            CopyMemory a(0), ByVal wParam, lParam
            str = StrConv(a, vbUnicode)
            MsgBox "收到dll字符串消息,字符串是:(" & str & ")"
      End If
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    程序没有执行:MsgBox "收到dll字符串消息,字符串是:(" & str & ")"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 00:02:3317楼 得分:0
    我又改了:
    vc:
    ///////////////////
    SendMessage(m_hWnd,12,(WPARAM)str,0);
    //////////////////////
    vb:
    Dim a(100) As Byte, i As Long, str As String
        If 12 = uMsg Then
        '  MsgBox "!!!!"
      '    ReDim a(wParam - 1)
            CopyMemory a(0), ByVal wParam, 100
            str = a
      '      str = StrConv(a, vbUnicode)
            Form1.Text1 = str
            MsgBox "收到dll字符串消息,字符串是:(" & str & ")"
      End If
    结果str全是:"?????"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:08:0518楼 得分:0
    最好不用str做为变量名,这是VB的保留字,是一个函数的名
    试:str1=strconv(a,vbfromunicode)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 21:33:5319楼 得分:0
    我最后测试通过了:
    vb代码是:
    '''''''''''''''''''''''''
    Dim a() As Byte, i As Long, str As String
        If 12 = uMsg Then
          ReDim a(wParam - 1)
          CopyMemory a(0), ByVal lParam, wParam
          str = StrConv(a, vbUnicode)
            Form1.Text1 = str
            MsgBox "收到dll字符串消息,字符串是:(" & str + ")"
      End If
    ''''''''''''''''''''''''''''''''''''''''''''''''''''
    vc代码是:
    ///////////////
    SendMessage(m_hWnd,12,strlen(str),(LPARAM)&(*str));//m_hWnd是vb窗口的代号
    ////////////////////////
    不知道我以上代码在:dll和VB程序不是同一个进程的情况下是否可以通过?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved