我在VB中通过dll调用c语言写的函数,函数循环捕捉数据包,在捕捉到的数据包满足一定的条件的时候,需要将消息传递给vb,而函数继续循环运行,在这种情况下,怎样将消息传递给vb?

解决方案 »

  1.   

    原函数继续运行,不需要等VB程序处理后再继续,也就是说,VB只是收消息并显示而已罗?那简单,直接在调用函数时传个句柄进去,然后VB里面子类化接收消息即可.函数中需要发消息时就用PostMessage投递消息到那个句柄.不过要注意的是,消息参数不能有指针.因为POST的消息并不知道什么时候被处理,如果参数中有指针,到时不能保证指针还是有效的.
      

  2.   

    PostMessage的确是一个好主意,那么问题的关键点就在于C程序怎么取得VB程序中的控件的句柄了。楼主有没有考虑过这个问题?其实有一个很简单的方法,就是C程序将消息存储在硬盘中(可以是文本文件、数据库),VB程序再访问硬盘就可以取得数据了(可以读文本文件,查询数据库),这种方法适合于实时性不高的情况。
      

  3.   

    同意Veron_04,还可以使用winsck来连接连个程序哦!通过网卡来连接连个程序,这个实时性也高,只要有SOCK编程经验就OK了,嘿嘿不失为一种选择啊
      

  4.   

    我的目的是当数据包满足一定的条件时,能够向vb发送一个指示,将数据包传给vb,c函数继续循环运行。各位还有什么好办法?
      

  5.   

    我前面提到的方法是其中一种,消息投递.还有另一种方法是我所知道的,回调.具体做法是,将一个特定格式的函数的地址传给DLL,由DLL在需要的时候调用这个函数.系统中比较典型的此类做法的API是SetTimer,它实现了投递消息与回调两种用法.但回调的问题在于,一定要等到回调函数返回后,DLL中的过程才会继续.所以还是使用消息投递吧,参数不够用的话就传个通知,并再提供个函数专门用于取数据.EXE在收到通知后,调用那个函数从DLL中取回所需要的数据.
      

  6.   

    我倒有一个办法,有些偏:
    计算机上有COM1和COM2,把这两个串口连接起来,通过串口通信来传递消息,,呵呵,是不是有些偏啊??:)
      

  7.   

    1.PostMessage
    2.回调函数
    3.临时文件作标记
      

  8.   

    4.串口
    5.socket
    6.数据库字段值
      

  9.   

    比较理想的做法是在C的DLL中创建一个先进先出的队列,并开启一个线程,主函数循环判断,条件符合直接向队列添加数据不做任何处理。 线程不停轮询,有数据时直接从队列取出数据向VB窗体Send WM_COPYDATA消息,利用SendMessage()必须等待返回的特性,VB就能够有序的执行DLL返回的消息,同时DLL也不会产生堵塞情况