情况是这样:
我用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
我用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
按Ctrl+F5运行
看看VB报告什么
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
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)
此时要注意
SMS_TYPE结构申明有问题VB的String实际上是UniCode的BSTR
在传递的过程中,会自动转为ABSTR,调用后再自动转回
本来这样设计是为了方便使用者
但这样的自动转换极有可能造成无法预料的后果(如非法操作)
SMS_TYPE结构原来是怎么声明的?
你说的强制转换的方法,可能不太适合吧。
我的结构体中有字符串变量,它们所占用的内存空间,我一开始是不知道的。如果用copymemory,必须要知道内存块的大小才行。这样子,我就不能保证获取到全部数据了。
Type SMS_TYPE
mobileNum As String
time As String
SMSData As String
hfflag As Boolean
xh As String
End Type
MEMCPY(你要的数据,IPARAM,大小)