情况是这样:  
    我用vb做一个EXE文件。另外还有一个用VC写的DLL。大致流程是:我在vb中自定义一消息,调用DLL提供的接口,向DLL发送我的自定义消息和我的别的请求;DLL经过处理之后,以发消息的方式向我的vb代码返回处理结果。
    DLL提供的接口中没有让我发给它EXE主窗口的句柄的接口,就是说,我不用告诉它我的主窗口句柄。          
    现在,我不清楚在vb中怎样写代码来接收DLL发过来的消息。请问,各位大侠,该怎么办?  
    我写了如下代码,不过不起作用。我用的子类化方法,不过好象没有把消息处理函数挂上,请各位看一下。  
 
Public  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  Function  GetWindowLong  Lib  "user32"  Alias  "GetWindowLongA"  (ByVal  hWnd  As  Long,  ByVal  nIndex  As  Long)  As  Long  
Public  Declare  Function  SetWindowLong  Lib  "user32"  Alias  "SetWindowLongA"  (ByVal  hWnd  As  Long,  ByVal  nIndex  As  Long,  ByVal  dwNewLong  As  Long)  As  Long  '用户自定义消息
Public Const WM_USER = &H400
Public Const WM_MYMSG = WM_USER + 10
 
Public  prevWndProc  As  Long  
 
Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal iParam As Long) As Long   
    Select Case Msg
        Case WM_CLOSE
            MsgBox "being closed..."
        Case WM_MYMSG
            Select Case wParam
                Case 0:
                    MsgBox "You Can Send SMS!"
                Case 1:
                    MsgBox "Module Error!"
            End Select 'end select case wParam
        Case Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, iParam)
    End Select 'end select case msg
End FunctionPrivate Sub Form_Load()
    prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
    
    Dim l As Long
    l = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WndProc)
End SubPrivate Sub Form_Unload(Cancel As Integer)
    Dim l As Long
    l = SetWindowLong(Me.hWnd, GWL_WNDPROC, prevWndProc)
End Sub

解决方案 »

  1.   

    难怪你在每个模块(包括窗口模块)前写上“Option Explicit”
    按Ctrl+F5运行
    看看VB报告什么
      

  2.   

    Private Const GWL_WNDPROC As Long = -4
      

  3.   

    估计是没有,变量最好还是要声明的,option explicit
      

  4.   

    谢谢两位的指点,我现在还有一点疑问。   我的vb程序中,只能向VC提供的DLL发送我自己定义的窗口消息序号,不发送我的主窗口的句柄。DLL处理完之后就发消息给我的VB程序。这样,我上面写的消息处理函数能够拦截到DLL发给我的消息吗?我觉得好象必须给DLL窗口句柄才行。请再赐教。   解决了这么问题,我马上给分,谢谢了哈
      

  5.   

    不好意思,我再问一个问题。上面那个消息处理函数中,有一个问题不能解决,见下面代码:'结构体
    Type SMS_TYPE
        mobileNum As String     
        time As String         
        SMSData As String      
        hfflag As Boolean      
        xh As String           
    End TypePublic Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal iParam As Long) As Long
        Dim fsxh As Integer
        Dim SMS As SMS_TYPE
        
        Select Case Msg
            Case WM_CLOSE
                MsgBox "出现严重错误,请重新配置系统!"
            Case WM_MYMSG
                Select Case wParam
                    Case 0:
                        MsgBox "启动TC35模块成功,You Can Send SMS!"
                    Case 1:
                        MsgBox "***启动TC35模块失败,Module Error!"
                    Case 2:
                        fsxh = iParam
                        MsgBox "发送SMS成功,Send SMS OK!  The Serail Number is " & CStr(Hex(fsxh))
                    Case 3:
                        MsgBox "发送SMS失败,Send SMS Error!"
                    Case 4:
                        
            '怎样取得lparam地址指向的数据?<<<<<<<<问题在这里,
            'lparam是有长整数,实际上是一结构体变量的地址。我要把它指向的结构体变量
            '里面的数据取出来。在c/c++中很好办,强制转换一下就可以了,
            '但是在vb中该怎么做呢?请指教。下面是c的代码,请高手指点vb该怎样实现类似功能。
             {
                 stc_SMS *a=(stc_SMS*)lpAram;
                 TRACE("收到新短消息,收到%s于%s发送给你的消息:\n%s\n回执标志:%d短消息序号: %s\n",a->mobilenum,a->Time,a->SMSData,a->hfflag,a->xh);
             }
                End Select 'end select case wParam
            Case Else
                WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, iParam)
        End Select 'end select case msg
    End Function
      

  6.   

    在vb中强制转化可以使用下面这个笨办法
    type mytype
       a as byte
       b as byte
       c as integer
    end type
    dim l(0 to 0 ) as long
    dim t(0 to 0 ) as mytype
    copymemory( t(0), l(0),4)
      

  7.   

    至于dll不需要你的句柄,不知道怎么弄的,想不通,估计他自己会变戏法。
      

  8.   

    copymemory(SMS, iParam, Len(SMS))
    此时要注意
    SMS_TYPE结构申明有问题VB的String实际上是UniCode的BSTR
    在传递的过程中,会自动转为ABSTR,调用后再自动转回
    本来这样设计是为了方便使用者
    但这样的自动转换极有可能造成无法预料的后果(如非法操作)
    SMS_TYPE结构原来是怎么声明的?
      

  9.   

    to  jennyvenus():你好。
    你说的强制转换的方法,可能不太适合吧。
    我的结构体中有字符串变量,它们所占用的内存空间,我一开始是不知道的。如果用copymemory,必须要知道内存块的大小才行。这样子,我就不能保证获取到全部数据了。 
    Type SMS_TYPE
        mobileNum As String     
        time As String         
        SMSData As String      
        hfflag As Boolean      
        xh As String           
    End Type
      

  10.   

    sorry, i don't know how to convert pointer to unlimit length custom type
      

  11.   

    用VC中的MEMCPY转换一下,
    MEMCPY(你要的数据,IPARAM,大小)